秒殺多線程-經(jīng)典線程同步總結(jié) 關(guān)鍵段 事件 互斥量 信號量
1.線程(進程)同步的主要任務(wù)
使并發(fā)執(zhí)行的各線程之間能夠有效的共享資源和相互合作,從而使程序的執(zhí)行具有可再現(xiàn)性
2.線程(進程)之間的制約關(guān)系?
(1).間接相互制約。一個系統(tǒng)中的多個線程必然要共享某種系統(tǒng)資源,如共享CPU,共享I/O設(shè)備,所謂間接相互制約即源于這種資源共享,打印機就是最好的例子,線程A在使用打印機時,其它線程都要等待。
(2).直接相互制約。這種制約主要是因為線程之間的合作,如有線程A將計算結(jié)果提供給線程B作進一步處理,那么線程B在線程A將數(shù)據(jù)送達之前都將處于阻塞狀態(tài)。
間接相互制約可以稱為互斥,直接相互制約可以稱為同步,對于互斥可以這樣理解,線程A和線程B互斥訪問某個資源則它們之間就會產(chǎn)個順序問題——要么線程A等待線程B操作完畢,要么線程B等待線程A操作完畢,這其實就是線程的同步了。因此同步包括互斥,互斥其實是一種特殊的同步

關(guān)鍵段與互斥量都有“線程所有權(quán)”概念,可以將“線程所有權(quán)”理解成旅館的房卡,在旅館前臺登記名字擁有房卡后是可以多次進出房間的,其它人則無法進入直到你交出房卡。每個線程必須先通過EnterCriticalSection或WaitForSingleObject來嘗試獲得“線程所有權(quán)”才能調(diào)用LeaveCriticalSection或ReleaseMutex。否則會調(diào)用失敗,這就相當于偽造房卡去辦理退房手續(xù)——由于登記本上沒有你的名字所以會被拒絕。
互斥量能很好的處理“遺棄”情況,因此在多進程之間可以放心的使用。


注意事件的手動置位和自動置位要分清楚,不要混淆了。


信號量在計數(shù)大于0時表示觸發(fā)狀態(tài),調(diào)用WaitForSingleObject不會阻塞,等于0表示未觸發(fā)狀態(tài),調(diào)用WaitForSingleObject會阻塞直到有其它線程遞增了計數(shù)。

參考:https://blog.csdn.net/morewindows/article/details/7538247