下面內容來自:
前面介紹了關鍵段cs、事件event、互斥量mutex在經典執行緒同步問題中的使用。本篇介紹用訊號量semaphore來解決這個問題。
首先也來看看如何使用訊號量,訊號量semaphore常用有三個函式,使用很方便。下面是這幾個函式的原型和使用說明。
第乙個createsemaphore
函式功能:建立訊號量
函式原型:
handle
createsemaphore(
lpsecurity_attributeslpsemaphoreattributes,
longlinitialcount,
longlmaximumcount,
lpctstrlpname
);函式說明:
第乙個引數表示安全控制,一般直接傳入null。
第二個引數表示初始資源數量。
第三個引數表示最大併發數量。
第四個引數表示訊號量的名稱,傳入null表示匿名信號量。
第二個opensemaphore
函式功能:開啟訊號量
函式原型:
handle
opensemaphore(
dworddwdesiredaccess,
boolbinherithandle,
lpctstrlpname
);函式說明:
第乙個引數表示訪問許可權,對一般傳入semaphore_all_access。詳細解釋可以檢視msdn文件。
第二個引數表示訊號量控制代碼繼承性,一般傳入true即可。
第三個引數表示名稱,不同程序中的各執行緒可以通過名稱來確保它們訪問同乙個訊號量。
第三個releasesemaphore
函式功能:遞增訊號量的當前資源計數
函式原型:
bool
releasesemaphore(
handlehsemaphore,
longlreleasecount,
lplonglppreviouscount
);函式說明:
第乙個引數是訊號量的控制代碼。
第二個引數表示增加個數,必須大於0且不超過最大資源數量。
第三個引數可以用來傳出先前的資源計數,設為null表示不需要傳出。
注意:當前資源數量大於0,表示訊號量處於觸發,等於0表示資源已經耗盡故訊號量處於末觸發。在對訊號量呼叫等待函式時,等待函式會檢查訊號量的當前資源計數,如果大於0(即訊號量處於觸發狀態),減1後返回讓呼叫執行緒繼續執行。乙個執行緒可以多次呼叫等待函式來減小訊號量。
最後乙個 訊號量的清理與銷毀
由於訊號量是核心物件,因此使用closehandle()就可以完成清理與銷毀了。
在經典多執行緒問題中設定乙個訊號量和乙個關鍵段。用訊號量處理主線程與子執行緒的同步,用關鍵段來處理各子執行緒間的互斥。詳見**:
#include #include#include
long
g_nnum;
unsigned
int __stdcall fun(void *ppm);
const
int thread_num = 10
; //
訊號量與關鍵段
handle g_hthreadparameter;
critical_section g_csthreadcode;
intmain()
waitformultipleobjects(thread_num, handle, true, infinite);
//銷毀訊號量和關鍵段
可以看出來,訊號量也可以解決執行緒之間的同步問題。
由於訊號量可以計算資源當前剩餘量並根據當前剩餘量與零比較來決定訊號量是處於觸發狀態或是未觸發狀態,因此訊號量的應用範圍相當廣泛。
多執行緒學習筆記7之執行緒池
executors 建立執行緒池的類,提供四種執行緒池 public class callabledemo callable callable是乙個任務,類似於runnable,但是callable任務是有返回值的,一般用執行緒池去執行這個callable任務,返回乙個包含callable執行結果的...
Python 多執行緒7 執行緒通訊
很多時候,執行緒之間會有互相通訊的需要。常見的情形是次要執行緒為主要執行緒執行特定的任務,在執行過程中需要不斷報告執行的進度情況。前面的條件變數同步已經涉及到了執行緒間的通訊 threading.condition的notify方法 更通用的方式是使用threading.event物件。thread...
Linux多執行緒實踐 7 多執行緒排序對比
int pthread barrier init pthread barrier t restrict barrier,const pthread barrierattr t restrict attr,unsigned count int pthread barrier destroy pthre...