- 信号量
信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它使得资源被使用了1个),当该整数值为零时,所有试图通过它的线程(车辆)都将处于等待状态。在信号量上我们定义两种操作: Wait(等待函数) 和 Release(释放函数)。当一个线程调用Wait操作时,它要么得到资源然后将信号量减一,要么一直等下去(指放入阻塞队列),直到信号量大于等于一时。Release(释放)对应于车辆离开停车场,该操作之所以叫做“释放”是因为释放了由信号量守护的资源(车位)。
#include<iostream>
#include <windows.h>
#include<process.h>
using namespace std;
long g_nNum;
unsigned int _stdcall Fun(void * pPM);
const int THREAD_NUM = 10;
HANDLE g_hThreadParameter; //信号量
CRITICAL_SECTION g_csThreadCode; //临界区
int main()
{
g_hThreadParameter = CreateSemaphore(NULL, 0, 1, NULL); //四个参数依次为:安全属性、 信号量的初始值、信号量的最大值、信号量名
InitializeCriticalSection(&g_csThreadCode);
HANDLE handle[THREAD_NUM];
int i = 0;
while (i < THREAD_NUM) {
handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);
Sleep(1);
WaitForSingleObject(&g_hThreadParameter, INFINITE); //mutex的release就是把资源从本线程释放出去,再让其他线程去争抢,releasesemaphore则是通知waitforxxobject的线程可以运行了
++i;
}
WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
DeleteCriticalSection(&g_csThreadCode);
CloseHandle(g_hThreadParameter);
for (i = 0; i < THREAD_NUM; i++)
CloseHandle(handle[i]);
return 0;
}
unsigned int _stdcall Fun(void *pPM) {
int nThreadNum = *(int*)pPM;
ReleaseSemaphore(g_hThreadParameter, 1, NULL); //信号量++ , 当前资源数量大于0,表示信号量处于触发,等于0表示资源已经耗尽故信号量处于末触发。
Sleep(50);
EnterCriticalSection(&g_csThreadCode);
++g_nNum;
Sleep(10);//do something
printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum);
LeaveCriticalSection(&g_csThreadCode);
return 0;
}