<一>线程间同步原因
- 线程间竞争共享资源;
- 线程间为完成某个任务而协作;
通过互斥量可以实现线程间由于竞争所需要的同步,通过事件可以实现线程间由于协作所需要的同步。
信号量很好地将互斥量和事件结合起来,同时解决竞争和协作问题。
信号量的两个核心操作:提高计数值和降低计数值(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);//指定要信号量的计数值增加1 return 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; }