標籤:
1.多線程同步與多線程互斥的關係
其實這也是我一直困擾的問題,在這裡我只是說說我的理解。
我的理解是多線程互斥是針對於多線程資源而言的。
而多線程同步是針對於多線程時序問題。
由於線程的並發性導致其已耗用時間的不確定性,所以我們需要
控制多個線程的協同工作。
還是舉賣票的例子來區別互斥和同步的區別吧:
比如我們有兩個視窗進行賣票,當然這裡就需要一個全域變數
來計數當前賣了第幾張票了,最重要的是一張票不能賣出去兩次,
所以當視窗1在賣第N張票的時候,視窗2應該就不能賣第N張票,
否則當不進行互斥的時候,兩個視窗就可能出現賣出去同一張票。
所以兩個賣票的視窗賣票的過程是一個互斥的過程。
對於同步,我們可以舉這樣一個賣票的例子,當有兩個賣票的視窗
交替的進行賣票。每個視窗買一個小時。那麼當第一個視窗賣了一個
小時之後告訴第二個視窗你該開始賣了,當第二個視窗賣了一個小時後
又會通知第一個視窗你別休息了快繼續賣票了。當然我們不難發現在這一過程
中自然的包含了互斥的過程,因為當第一個視窗賣過的票第二個視窗
是不能再賣的
不知道我說清楚沒有,我的感覺了線程同步的過程其實就包含了線程互斥。
線程互斥是一種特殊的線程同步情況。
2.關鍵區,互斥對象,事件對象,訊號量的總結
關鍵區:
CRITICALSECTION cs;建立關鍵區對象
InitializeCriticalSection(&cs);初始化關鍵區
EnterCriticalSection(&cs);進入關鍵區
LeaveCriticalSection(&cs);離開關鍵區
互斥對象:
HANDLE Mu;定義互斥對象
Mu=CreateMutex(.....);建立互斥對象
WaitSingleObject();等待互斥對象啟用
ReleaseMutex();釋放互斥對象的所有權
事件對象:
HANDLE Event;定義事件對象
Event=CreateEvent();建立事件對象
WaitSingleObject();等待事件對象啟用
ResetEvent();設定事件對象為無訊號
SetEvent();設定事件對象為有訊號
訊號量:
HANDLE sem;定義訊號量事件
sem=CreateSemaphore();建立訊號量事件
WaitSingleObject();等待事件對象啟用
ReleaseSemaphore();訊號量對象計數加1
3.對於這種線程同步方式的區別:
1.關鍵區屬於使用者態對象,而其他三種是核心態的對象。
所以使用關鍵區的效率較其他三種高,因為其他三種在使用的時候、
會進入核心態
2.關鍵區和互斥對象類似,主要解決資源的互斥訪問。而關鍵區僅能用於
線程同步,而互斥對象可以用於進程同步
3.事件對象主要用於線程的時序同步,比如一個線程結束了通知另外一個線程工作
4.而訊號量主要用於生產者消費者問題。比如,廚房有四個碗,但是這時候有
10個人要吃飯,那麼在同一時刻最多隻能由四個人同時吃飯。此時可把
訊號量對象的計數最大值設為4.
4.關於CreateThread()和_beginthread()函數的區別:
參考MoreWindows大神的博文:http://blog.csdn.net/morewindows/article/details/7421759
用一句話說起區別就是:CreateThread()建立的線程沒有考慮調用C運行庫函數導致的資料覆蓋問題
而_beginthread()在建立的時候自動為每個線程維護一塊記憶體供有需要的C運行庫函數。然而在底層
_beginthread()實際上仍然是調用Createthread()
5.關於CreateThread()建立線程會執行兩次:
最好在調用的時候不立即執行線程,設為為CREATE_SUSPEND
然後再ResumeThread()即可
windows多線程同步總結