信号量:
#include <iostream> #include<Windows.h> #include <process.h> HANDLE semaphore; CRITICAL_SECTION b; int num; unsigned int __stdcall ThreadFun(PVOID pm) { int m=*((int*)pm); ReleaseSemaphore(semaphore,1,NULL); EnterCriticalSection(&b); num++; std::cout<<m<<"说:"<<num<<std::endl; LeaveCriticalSection(&b); return 0; } int main() { const int n =50; HANDLE handle[n]; semaphore =CreateSemaphore(NULL,0,1,NULL); InitializeCriticalSection(&b);//旋转锁 旋转4000次 num = 0; int i=0; while(i<10){ handle[i] =(HANDLE)_beginthreadex(NULL,0,ThreadFun,&i,0,NULL); WaitForSingleObject(semaphore,INFINITE); i++; } WaitForMultipleObjects(n,handle,true,INFINITE); system("pause"); CloseHandle(semaphore); DeleteCriticalSection(&b); return 0; }
用信号量处理主线程与子线程的同步,用关键段来处理各子线程间的互斥。
由于信号量可以计算资源当前剩余量并根据当前剩余量与零比较来决定信号量是处于触发状态或是未触发状态,因此信号量的应用范围相当广泛。