多執行緒開發學習筆記之執行緒同步 事件

2021-04-15 06:26:59 字數 895 閱讀 3108

事件,在我看來就是一種觸發機制,即滿足某一條件的觸發。當執行緒需要等待某一事件的發生而不是乙個資源的解鎖,這在接收網路資訊包或等待乙個已完成某些任務的執行緒發出訊號時非常有用。在win32系統中,提供了事件物件。事件物件是同步物件中最簡單的形式,也是最具有彈性的同步機制。其與互斥量和訊號量的區別在於:互斥量和訊號量是用於對資料的訪問的,而事件是用來發訊號表示某一操作已經完成了。事件物件是一種核心物件,它的惟一目的就是成為激發狀態或未激發狀態,這兩種狀態完全由程式來控制,不會成為等待函式的***。

有兩種事件物件:一、人工重置。其作用是向幾個執行緒同時發訊號,表示某一操作已經完成;二、自動重置。其作用是向乙個執行緒發訊號,表示某一操作已經完成。

執行緒常用用途:事件最常用於乙個執行緒進行初始化工作後,發訊號給另乙個執行緒,讓其完成剩餘的工作。初始化執行緒將事件設定為無訊號狀態後開始進行初始化,而後,當初始化完成後,執行緒把事件設定為有訊號狀態。當工作執行緒開始工作時,它立即自我掛起,等待事件變為有訊號。當初始化執行緒把事件設定為有訊號狀態後,工作縣城就醒來執行餘下的必要工作。

例如,乙個執行緒執行了兩個執行緒。第乙個執行緒從檔案中讀取資料到記憶體緩衝區,在資料讀完後,它就發訊號給第二個執行緒告訴它可以處理資料了。當第二個執行緒完成了對資料的處理後,它就需要再給第乙個執行緒發訊號,以便使第乙個執行緒能從檔案中讀取下一塊資料。

win32 api產生事件物件的函式原型如下:

/**/

/*brief 重置乙個事件物件。

* 該函式能將指定事件物件重置為無訊號狀態。

*/

bool resetevent(handle hevent);

單執行緒能在幾個同時的操作中定義不同的事件物件。如果是這種情況,用乙個多物件等待函式來等待將被標識的任何事件物件的狀態。也能用事件物件在許多情況下通知乙個正在等待的執行緒乙個事件的發生。這段話說得是乙個問題的兩種解決辦法。

多執行緒程式設計學習筆記 執行緒同步(二)

1.使用autoresetevent類來實現從乙個執行緒向另乙個執行緒發出通知。2.如下 using system using system.collections.generic using system.linq using system.text using system.threading ...

多執行緒程式設計學習筆記 執行緒同步(一)

中的示例 十,一樣如果多執行緒使用共享變數,就會涉及到乙個執行緒同步的問題。那如何解決呢?方法有三 1 重構程式,移除多執行緒的共享變數,讓乙個執行緒只訪問乙個自有變數 2 使用原子操作,乙個操作只占用乙個量子時間,一次完成,只有當當前操作完成之後,其他執行緒才能進行操作。這樣可以避免使用獨佔鎖,避...

多執行緒學習 執行緒同步 四

問題 子執行緒迴圈10次,回到主線程執行100次,接著又回到子執行緒執行10次,再回到主線程執行100次,如此迴圈50次,該如何實現?public class threadcommunicationstudy start for int i 1 i 50 i 資源類 class bussiness ...