C 多執行緒同步之Semaphore 訊號量

2022-05-08 14:27:12 字數 1976 閱讀 7681

一、

當多個執行緒對同一資源進行使用時,會產生「爭奪」的情況,為了避免這種情況的產生,也就出現了執行緒間的同步這個技術,本篇博文中將介紹使用訊號量semaphore達到執行緒間同步的目的。

二、相關函式和標頭檔案

//

標頭檔案#include //

建立訊號量api

handle winapi createsemaphore(

_in_opt_ lpsecurity_attributes lpsemaphoreattributes,

//指向security_attributes的指標;

_in_ long linitialcount, //

訊號量物件的初始值;

_in_ long lmaximumcount, //

訊號量物件的最大值,這個值必須大於0;

_in_opt_ lpctstr lpname //

訊號量物件的名稱;

);//

等待訊號量api

dword winapi waitforsingleobject(

_in_ handle hhandle,

//訊號量物件控制代碼

_in_ dword dwmilliseconds //

等待訊號量時間,infinet代表永久等待;

);返回值:

wait_abandoned(

0x00000080l

) 表示擁有訊號量的執行緒再終止前未釋放該訊號量;

wait_object_0(

0x00000000l

) 表示等到了訊號量;

wait_timeout(

0x00000102l

) 表示等待超時;

wait_failed((dword)

0xffffffff

) 表示該函式執行失敗,用getlasterror()得到錯誤碼;

//釋放訊號量控制代碼

bool winapi releasesemaphore(

_in_ handle hsemaphore,

//訊號量物件控制代碼;

_in_ long lreleasecount, //

訊號量釋放的值,必須大於0;

_out_opt_ lplong lppreviouscount //

前一次訊號量值的指標,不需要可置為空;

);返回值:成功返回非0;

三、範例

#include #include 

using

namespace

std;

handle g_hsemaphore = null; //

宣告訊號量變數

unsigned

long

winapi fun(lpvoid lpparamter)

exitthread(-1);}

intmain()

int iruntime = 0

; unsigned

long ulthreadid = 0

;

//建立乙個子執行緒

handle hthread = createthread(null, 0, fun, null, 0, &ulthreadid);

//執行100次跳出

while(++iruntime<100

)

system(

"pause");

return0;

}

C 多執行緒同步

在開發中經常會遇到執行緒的例子,如果某個後台操作比較費時間,我們就可以啟動乙個執行緒去執行那個費時的操作,同時程式繼續執行。在某些情況下可能會出現多個執行緒的同步協同的問題,下面的例子就展示了在兩個執行緒之間如何協同工作。這個程式的思路是共同做一件事情 從乙個arraylist中刪除元素 如果執行完...

多執行緒同步之synchronized

作用 當兩個或多個執行緒需要共享,update操作時,需要通過某種方法來確定該資源在任意時刻僅被乙個執行緒占用,實現上述目的的過程就叫同步 同步分為同步方法和同步語句 注意 synchronized宣告不會被整合,如果乙個用synchronized修飾的方法被子類覆蓋,那麼子類中這個方法不再具有同步...

C 多執行緒 執行緒同步事件

1 事件 事件是核心物件,多用於執行緒間通訊,可以跨程序同步 2 事件使用 1 建立事件 handle createevent lpsecurity attribute slpeventattributes,安全控制,一般直接傳入null bool bmanualreset,確定事件是手動還是自動 ...