CreateSemaphore

CreateSemaphore是Declare Function CreateSemaphore Lib "kernel32" Alias "CreateSemaphoreA" (lpSemaphoreAttributes AsSECURITY_ATTRIBUTES, ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As String) As Long。

綜述

VB聲明

VC聲明

作用

創建一個新的信號量

返回值

Long,如執行成功,返回信號量對象的句柄;零表示出錯。會設定GetLastError。即使返回一個有效的句柄,但倘若它指出同名的一個信號量已經存在,那么GetLastError也會返回ERROR_ALREADY_EXISTS

參數

lpSemaphoreAttributes SECURITY_ATTRIBUTES,指定一個SECURITY_ATTRIBUTES結構,或傳遞零值(將參數聲明為ByVal As Long,並傳遞零值)——表示採用不允許繼承的默認描述符。該參數定義了信號量的安全特性

lInitialCount Long,設定信號量的初始計數。可設定零到lMaximumCount之間的一個值

lMaximumCount Long,設定信號量的最大計數

lpName String,指定信號量對象的名稱。用vbNullString可創建一個未命名的信號量對象。如果已經存在擁有這個名字的一個信號量,就直接打開現成的信號量。這個名字可能不與一個現有的互斥體、事件、可等待計時器或檔案映射的名稱相符

註解

一旦不再需要,一定記住用CloseHandle關閉信號量的句柄。它的所有句柄都關閉以後,對象自己也會刪除

一旦值大於零,信號量就會觸發(發出信號)。ReleaseSemaphore函式的作用是增加信號量的計數。如果成功,就調用信號量上的一個等待函式來減少它的計數

詳細註解

Semaphore是另一個同步問題機制,不論是Event或Mutex,其他Process在執行WaitForSingleObject時,就看當時的對象是Signal或UnSignal而決定是否等待,而Semaphore也相同,但是它要變成Signal /UnSignal的狀態,卻有些不同,它是提供一個計數值,它允許在這個計數值之內,任何執行到WaitForSingleObject的Thread都不會停下來,而且每執行WaitForSingleObject一次,計數值就減一,當計數值變成0時,該Semaphore才會處於UnSignal的狀態,而某個Thread ReleaseSemaphore時,便會將計數值增加,以便其他的Thread或本身可得Signal的訊號,而使WaitForSingleObject停止等待。

例如說,該電腦只有兩個 COM PORT,所以只允許兩個計數值同時使用COM PORT,因此,

hSema = CreateSemaphore(ByVal 0&, 2, 2, "MySema")

第2個參數表示:剛開始的時候,有多少個COM PORT可使用

第3個參數表示:最多有多少個COM PORT可使用

第4個參數:Semaphore的名稱,只要名稱相同,則傳回的handle(hSema)會指向相同的Semaphore對象。

因此,要使用相同的名稱來Create Semaphore才能達共用一個Semaphore的效果。而使用

WaitForSingleObject來Check看看是否還有剩下的COM Port可使用,如果還有剩(計數值 > 0),則沒有

等待而可執行下一行指令,同時,計數值減1。若有第三個要求COM PORT的使用,那它就得等待,直到

有Thread執行ReleaseSemaphore(hSema, 1, count)

第2個參數表示:Release多少個COM PORT出來,一般來說都是1,表示一個ReleaseSemaphore

會將計數器的值加一,但是您也可以指定 > 1的值,代表一口氣增加計數器的值( + n , n > 1)。例如,您的程式一口氣使用了兩個COM PORT,並假設您於程式中有使用WaitForSingleObject兩次,程式最後,使用

ReleaseSemaphore(hSema, 2, count)而不必

ReleaseSemaphore(hSema, 1, count)執行兩次。

第3個參數表示:ReleaseSemaphore執行之前計數器原來的值。

Semaphore和Event有個地方相同,那就是沒有Owner的觀念,即Thread A 所Create出的

Semaphore對象,於Thread B中執行ReleaseSemaphore時,依然會增加計數器的值

示例:

write執行緒寫了之後,read1,read2,read3才能讀,且只有3個執行緒都讀完,write函式才能向buffer中寫。

下面是具體代碼:

相關詞條

相關搜尋

熱門詞條

聯絡我們