<一>线程间同步原因
- 线程间竞争共享资源;
- 线程间为完成某个任务而协作;
通过互斥量可以实现线程间由于竞争所需要的同步,通过事件可以实现线程间由于协作所需要的同步。
信号量很好地将互斥量和事件结合起来,同时解决竞争和协作问题。
信号量的两个核心操作:提高计数值和降低计数值(Up 和 Down)。Down操作时检查信号量的计数值是否大于0,如果大于0,则信号量的计数值减1,线程继续运行;如果计数值为0,线程由于不能获得信号量而进入睡眠状态。这两个操作都是不可再分的操作。
与信号量有关的函数:
函数名 | 作用 |
CreateSemaphore | 创建一个信号量 |
OpenSemaphore | 打开一个已经创建的信号量 |
ReleaseSemaphore | 释放对信号量的所有权 |
老规矩,看例子:
#include <windows.h> #include <process.h> /* _beginthread, _endthread */ #include <iostream> #include <fstream> using namespace std;HANDLE hSemaphore;DWORD WINAPI myThread(LPVOID lpParam) {int* pNo = (int*)lpParam;WaitForSingleObject(hSemaphore,INFINITE);//等待信号量 cout<<"*****Thread #"<<*pNo<<" Get the semaphore"<<endl;Sleep(1000*(*pNo));cout<<"*****Thread #"<<*pNo<<" release the semaphore"<<endl;ReleaseSemaphore(hSemaphore,1,NULL);//指定要信号量的计数值增加1return 1; }int main() {DWORD dw;hSemaphore = CreateSemaphore(NULL,3,3,NULL);//初始值为3,最大值也为3的信号量int t[6];for (int i=0;i<6;i++){t[i]=i+1;CreateThread(NULL,0,myThread,t+i,0,&dw);}Sleep(60000);return 0; }