多執行緒同步的四種方式 事件物件

2021-09-26 06:55:42 字數 1266 閱讀 3247

問題的引入:模仿12306多人同時搶票。

解決方法:使用事件物件。

事件物件也屬於核心物件,包含乙個使用計數,乙個用於指明該事件是乙個自動o重置的事件還是乙個人工重置的事件的布林值,另乙個用於指明該事件處於已通知狀態還是未通知狀態的布林值。

有兩種不同型別的事件物件。一種是人工重置的事件,另一種是自動重置的事件。當人工重置的事件得到通知時,等待該事件的所有執行緒均變成可排程執行緒。當乙個自動重置的事件得到通知時,等待該事件的執行緒中只有乙個執行緒變成可排程執行緒。

建立事件物件

handle createevent(

lpsecurity_attributes lpeventattributes, //被忽略的,必須為null

bool bmanualreset, //true表示手動重置狀態,false表示自動重置狀態

bool binitialstate, //true表示初始是有訊號狀態,false表示無訊號

lptstr lpname //事件物件的名稱

);

設定事件物件的訊號狀態

bool setevent(

handle hevent

);

**:

#include //需要呼叫windows api

#include using namespace std;

dword winapi fun1proc(lpvoid lpparamter);

dword winapi fun2proc(lpvoid lpparamter);

handle g_hevent;

int ntickets = 100; //總票數

int main()

dword winapi fun1proc(lpvoid lpparamter)

else

/*因為我們建立的是自動重置的事件物件,當執行緒1得到該事件物件後,

系統會自動將該事件物件設定為非訊號狀態。如果不呼叫setevent,

執行緒1、2後面都得不到該事件物件。

*/setevent(g_hevent); //設定為有訊號狀態

}return 0;

}dword winapi fun2proc(lpvoid lpparamter)

else

setevent(g_hevent); //設定為有訊號狀態

} return 0;

}

執行緒同步的四種方式

1 臨界區 critical section 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。優點 保證在某一時刻只有乙個執行緒能訪問資料的簡便辦法 缺點 雖然臨界區同步速度很快,但卻只能用來同步本程序內的執行緒,而不可用來同步多個程序中的執行緒。2 互斥量 mutex 為協調...

多執行緒 四種建立方式

public class threadestablish1 start 主線程 for int i 0 i 100 i 1.建立乙個實現了thread類的子類 class subthread extends thread 注意點 如果自己手動呼叫run 方法,那麼就只是普通方法,沒有啟動多執行緒模式...

多執行緒的四種建立方式

方式1 繼承於thread類 建立乙個繼承於thead類的子類 重寫thread類的run方法 建立thread的物件 通過該物件呼叫start class aextends thread 在main方法中直接呼叫start 方法 public static void main string arg...