信號量在多線程中,主要是用於線程的同步或者限制線程運行的數量。ios
所謂同步,當流程1運行在線程1中,流程2運行在線程2中,流程2必須在流程1結束以後才能開始執行。你會怎麼作,全部就須要給出一個流程1結束的信號。多線程
在信號來以前,讓線程2先在某個位置等待,這個使用方式和互斥鎖有點相似,互斥從某種意義上也是一種同步,只是互斥鎖更傾向於保護共同資源。信號量大於0的時候就表明有信號,不須要等待,但不單單是1。函數
下面的這個例子設置了3個線程,設置最大同時只運行2個進程。spa
#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個線程