綜述
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中寫。
下面是具體代碼: