信號量在多線程中,主要是用於線程的同步或者限制線程運行的數量。
所謂同步,當流程1運行在線程1中,流程2運行在線程2中,流程2必須在流程1結束之后才能開始執行。你會怎么做,所有就需要給出一個流程1結束的信號。
在信號來之前,讓線程2先在某個位置等待,這個使用方式和互斥鎖有點類似,互斥從某種意義上也是一種同步,只是互斥鎖更傾向於保護共同資源。信號量大於0的時候就代表有信號,不需要等待,但不僅僅是1。
下面的這個例子設置了3個線程,設置最大同時只運行2個進程。
#include<Windows.h> #include<iostream> using namespace std; //創建一個信號量 HANDLE hSemaphore; //有參數 DWORD WINAPI MyThread2(LPVOID lpParamter) { while (1) { WaitForSingleObject(hSemaphore,INFINITE); cout << "MyThread1 Runing :"<<"線程2" << endl; Sleep(2000); ReleaseSemaphore(hSemaphore,1,NULL);//釋放信號量 } } //無參數 DWORD WINAPI MyThread1(LPVOID lpParamter) { while (1) { //信號量減1,如果等於0就進入睡眠,待大於0之后再減 WaitForSingleObject(hSemaphore,INFINITE); cout << "MyThread2 Runing"<<"線程1" << endl; Sleep(2000); //信號量加1 ReleaseSemaphore(hSemaphore,1,NULL);//釋放信號量 } } //無參數 DWORD WINAPI MyThread3(LPVOID lpParamter) { while (1) { //信號量減1,如果等於0就進入睡眠,待大於0之后再減 WaitForSingleObject(hSemaphore,INFINITE); cout << "MyThread2 Runing"<<"線程3" << endl; Sleep(2000); //釋放信號量,信號量加1 ReleaseSemaphore(hSemaphore,2,NULL); } } int main() { //創建一個信號量,2是初值,3是最大值 hSemaphore =CreateSemaphore(NULL,2,3,NULL); //第三個參數是線程函數的地址,第四個參數是傳到線程的參數指針 HANDLE hThread = CreateThread(NULL, 0, MyThread1, NULL, 0, NULL); //釋放句柄 CloseHandle(hThread); HANDLE hThread1 = CreateThread(NULL, 0, MyThread2, NULL, 0, NULL); CloseHandle(hThread); HANDLE hThread3 = CreateThread(NULL, 0, MyThread3, NULL, 0, NULL); //釋放句柄 CloseHandle(hThread3); while(1); return 0; }
結果可以看到,三個線程交替運行2個