訊號量 win32 API函式

2021-07-10 17:16:25 字數 1206 閱讀 9779

一、關於訊號量

1、在訊號量中有乙個內建的計數值,用於對資源進行計數;同時它通過內建的互斥機制保證在有多個執行緒試圖對計數值進行修改時,在任一時刻只有乙個執行緒對計數值進行修改。

2、訊號量的兩個核心操作是up操作(提高計數值)和down操作(降低計數值):

1)down操作:

檢查訊號量的計數值是否大於零

1》若大於零,訊號量的計數值減一(即用掉了乙個訊號量計數了),執行緒繼續執行;

2》若等於零(也就是執行緒不能獲得所需的訊號量了),於是進入睡眠狀態。

down操作的原子性保證了一旦乙個執行緒對訊號量的

操作開始,其他執行緒就不能訪問,知道操作完成或阻塞。

2)up操作

用於執行緒釋放對訊號量的所有權,提高訊號量的計數值。

若有多個執行緒正睡眠在該訊號量上,則其中乙個被作業系統選中,並被允許呼叫down操作,此時計數值仍為零。於是睡眠在該訊號量上的少了乙個。

二、有關函式

createsemaphore()   建立乙個訊號量

opensemaphore()     開啟乙個已經建立的訊號量

releasesemaphore()  釋放對訊號量的所有權

三、用法

#include

#include

#include

handle hsemaphore;

dword winapi mythread(lpvoid lpparameter)

{int *pno=(int*)lpparameter;

waitforsingleobject(hsemaphore,infinite);//等待訊號量

cout<

1、主線程建立了乙個訊號量,每次只允許3個執行緒同時獲得訊號量,於是執行緒1,2,3獲得訊號量,其餘三個處於睡眠狀態。

2、1000毫秒之後,執行緒1釋放訊號量,執行緒4獲得

3、2000毫秒之後,執行緒2釋放訊號量,執行緒5獲得

4、3000毫秒之後,執行緒3釋放訊號量,執行緒6獲得

5、最後6000毫秒的時間到,執行緒4,5,6分別釋放訊號量。程式結果執行如下。

由於競爭的關係,搶到訊號量的執行緒是隨機的,所以會出現不一定按1,2,3順序輸出的情況。

從這可以清楚的看到,只有釋放了乙個執行緒,才能再獲得乙個,總之就是在同乙個時刻裡只能有三個執行緒能擁有該訊號量。

Win32 API講座 視窗函式

位。windows是用乙個長整形的資料的位設定方式來記錄類和視窗的樣式的。其中,視窗樣式由乙個32位樣式以及另乙個32 位擴充套件樣式來構成。類樣式操作由上述列表中的getclasslong以及getclasslong來進行,視窗樣式操作由getwindowlong 以及setwindowlong來...

Win32 API訊息函式 GetMessage

函式功能 該函式從呼叫執行緒的訊息佇列裡取得乙個訊息並將其放於指定的結構。此函式可取得與指定視窗聯絡的訊息和由postthreadmesssge寄送的執行緒訊息。此函式接收一定範圍的訊息值。getmessage不接收屬於其他執行緒或應用程式的訊息。函式原型 bool getmessage lpmsg...

win 32Api獲取系統記憶體函式

windows程式設計中 獲取系統記憶體資訊有2個api,分別是globalmemorystatus和globalmemorystatu globalmemorystatus函式可以在c語言咧直接呼叫,但是globalmemorystatu 卻不可以直接呼叫,因為globalmemorystatu ...