在windows下:
信號(hào)量(Semaphore)內(nèi)核對(duì)象對(duì)線程的同步方式,它允許多個(gè)線程在同一時(shí)刻訪問(wèn)同一資源,但是需要限制在同一時(shí)刻訪問(wèn)此資源的最大線程數(shù)目。
CreateSemaphore()
OpenSemaphore()
ReleaseSemaphore(),
WaitForSingleObject()/WaitForMultipleObjects()
CreateSemaphore()創(chuàng)建信號(hào)量時(shí)即要同時(shí)指出允許的最大資源計(jì)數(shù)和當(dāng)前可用資源計(jì)數(shù)。
一般是將當(dāng)前可用資源計(jì)數(shù)設(shè)置為最大資源計(jì)數(shù),
每增加一個(gè)線程對(duì)共享資源的訪問(wèn),當(dāng)前可用資源計(jì)數(shù)就會(huì)減1,
只要當(dāng)前可用資源計(jì)數(shù)是大于0的,就可以發(fā)出信號(hào)量信號(hào)。
但是當(dāng)前可用計(jì)數(shù)減小到0時(shí)則說(shuō)明當(dāng)前占用資源的線程數(shù)已經(jīng)達(dá)到了所允許的最大數(shù)目,不能在允許其他線程的進(jìn)入,此時(shí)的信號(hào)量信號(hào)將無(wú)法發(fā)出。
線程在處理完共享資源后,應(yīng)在離開(kāi)的同時(shí)通過(guò)ReleaseSemaphore()函數(shù)將當(dāng)前可用資源計(jì)數(shù)加1。在任何時(shí)候當(dāng)前可用資源計(jì)數(shù)決不可能大于最大資源計(jì)數(shù)。
說(shuō)明如下:
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 安全屬性指針
LONG lInitialCount, // 初始計(jì)數(shù)
LONG lMaximumCount, // 最大計(jì)數(shù), 定義了允許的最大資源計(jì)數(shù)
LPCTSTR lpName // 對(duì)象名指針, 創(chuàng)建的信號(hào)量定義一個(gè)名字,其創(chuàng)建的是一個(gè)內(nèi)核對(duì)象,因此在其他進(jìn)程中可以通過(guò)該名字而得到此信號(hào)量
);
OpenSemaphore()函數(shù)即可用來(lái)根據(jù)信號(hào)量名打開(kāi)在其他進(jìn)程中創(chuàng)建的信號(hào)量,函數(shù)原型如下:
HANDLE OpenSemaphore(
DWORD dwDesiredAccess, // 訪問(wèn)標(biāo)志
BOOL bInheritHandle, // 繼承標(biāo)志
LPCTSTR lpName // 信號(hào)量名
);
在線程離開(kāi)對(duì)共享資源的處理時(shí),通過(guò)ReleaseSemaphore()來(lái)增加當(dāng)前可用資源計(jì)數(shù)。否則將會(huì)出現(xiàn)當(dāng)前正在處理共享資源的實(shí)際線程數(shù)并沒(méi)有達(dá)到要限制的數(shù)值,
而其他線程卻因?yàn)楫?dāng)前可用資源計(jì)數(shù)為0而仍無(wú)法進(jìn)入的情況。
BOOL ReleaseSemaphore(
HANDLE hSemaphore, // 信號(hào)量句柄
LONG lReleaseCount, // 計(jì)數(shù)遞增數(shù)量
LPLONG lpPreviousCount // 先前計(jì)數(shù),可以設(shè)置為NULL,
);
該函數(shù)將lReleaseCount中的值添加給信號(hào)量的當(dāng)前資源計(jì)數(shù),一般將lReleaseCount設(shè)置為1,
WaitForSingleObject和WaitForMultipleObjects主要用在試圖進(jìn)入共享資源的線程函數(shù)入口處,
主要用來(lái)判斷信號(hào)量的當(dāng)前可用資源計(jì)數(shù)是否允許本線程的進(jìn)入。
只有在當(dāng)前可用資源計(jì)數(shù)值大于0時(shí),被監(jiān)視的信號(hào)量?jī)?nèi)核對(duì)象才會(huì)得到通知。