一、
當多個執行緒對同一資源進行使用時,會產生「爭奪」的情況,為了避免這種情況的產生,也就出現了執行緒間的同步這個技術,本篇博文中將介紹使用訊號量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 #includeusing
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,確定事件是手動還是自動 ...