信号量用于线程同步,同步就是协调解决问题。
拥有信号量的线程可以执行,没有信号量的线程等待其他线程释放信号量后获取信号量后可以执行。
步骤:
1.创建一个信号量对象,该对象存储了信号量个数。
HANDLE handle=CreateSemaphore(NULL,initCount,maxCount,name);
参数2:可用的信号量个数,必须小于等于maxCount,且大于等于0;
参数3:最大的信号量,必须大于0;
参数4:该信号量的名称。
在该函数后调用hResult=GetLastError(),若hResult==ERROR_ALREADY_EXIST,表示该名称的信号量已经存在了。
2.等待获取信号量
WaitSingnalObject(handle,timeout);
等待信号量,若信号量对象有信号量,则直接返回;或者等待时间超过timeout后也返回。timeout=INFINITE表示永不超时。
该函数用于抢到信号量后才能返回并执行后面的语句,否则一直等待,直到超时,或者获得了信号量。
当该函数返回(即获得了信号量),信号量对象的信号量数据减少一个。
3.获取信号量后在释放信号量
ReleaseSemaphore(handle,count,&count_left);
参数1:信号量对象的句柄;
参数2:释放信号量的个数;
参数3:执行该语句之前还剩下的信号量的个数。
当线程执行完毕后,调用该函数归还占有的信号量,此时信号量增加count个。
4.关闭信号量对象
CloseHandle(handle)
当信号量对象使用完毕后,就调用该函数释放信号量对象。