問題的引入:模仿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...