信号量
https://blog.csdn.net/sinat_31608641/article/details/106899946
// 信号量.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <Windows.h> #include <tchar.h> const TCHAR* szSemaphoreA = _T("_SemaphoreA_"); const TCHAR* szSemaphoreB = _T("_SemaphoreB_"); const TCHAR* szSemaphoreC = _T("_SemaphoreC_"); DWORD WINAPI Thread_1(LPVOID param); DWORD WINAPI Thread_2(LPVOID param); DWORD WINAPI Thread_3(LPVOID param); HANDLE hSM_1; HANDLE hSM_2; HANDLE hSM_3; HANDLE hThread_1; HANDLE hThread_2; HANDLE hThread_3; int main() { // 创建三个信号量 hSM_1 = CreateSemaphore(NULL, 1, 1, szSemaphoreA);//开始为signal状态 hSM_2 = CreateSemaphore(NULL, 0, 1, szSemaphoreB);//开始为unsignal状态,等待hSM_1释放 hSM_3 = CreateSemaphore(NULL, 0, 1, szSemaphoreC);//开始为unsignal状态,等待hSM_2 //创建三个线程 hThread_1 = CreateThread(NULL, 0, Thread_1, NULL, 0, NULL); hThread_2 = CreateThread(NULL, 0, Thread_2, NULL, 0, NULL); hThread_3 = CreateThread(NULL, 0, Thread_3, NULL, 0, NULL); //等待三个线程都执行完 WaitForSingleObject(hThread_1, INFINITE); WaitForSingleObject(hThread_2, INFINITE); WaitForSingleObject(hThread_3, INFINITE); //三个线程都执行完 printf("\n\n\t main end \n"); //关闭句柄 CloseHandle(hThread_1); CloseHandle(hThread_2); CloseHandle(hThread_3); CloseHandle(hSM_1); CloseHandle(hSM_2); CloseHandle(hSM_3); return 0; } DWORD WINAPI Thread_1(LPVOID param) { for (int i = 0; i < 10; i++) { DWORD dwWait = WaitForSingleObject(hSM_1, INFINITE); //每一个wait过后信号量的数量自动减1,这样就达到了控制同步 printf("A"); ReleaseSemaphore(hSM_2, 1, NULL); } return 0; } DWORD WINAPI Thread_2(LPVOID param) { for (int i = 0; i < 10; i++) { WaitForSingleObject(hSM_2, INFINITE); printf("B"); ReleaseSemaphore(hSM_3, 1, NULL); } return 0; } DWORD WINAPI Thread_3(LPVOID param) { for (int i = 0; i < 10; i++) { WaitForSingleObject(hSM_3, INFINITE); printf("C "); ReleaseSemaphore(hSM_1, 1, NULL); } system("pause"); return 0; }

浙公网安备 33010602011771号