線程同步技術

(1)互斥對象:函數CreateMutex。在多核下工作不正常。
(2)事件對象:函數CreateEvent、SetEvent、ResetEvent、WaitForSingleObject,應當使用自動重置的事件對象。在多核下工作正常。
(3)關鍵代碼段:類CRITICAL_SECTION,函數InitializeCriticalSection、DeleteCriticalSection、EnterCriticalSection、LeaveCriticalSection。在多核下工作基本正常,但是會出現:“"xxx"指令引用的"xxx"內存。該內存不能爲"written"。”。需要注意線程死鎖問題。

三者比較:
互斥對象和事件對象都屬於內核對象,速度較慢。但可以在多個進程中的各個線程間進行同步。
關鍵代碼段工作在用戶方式下,同步速度較快,但容易進入死鎖狀態,因爲在等待進入關鍵代碼段時無法設定超時值。通常,首選關鍵代碼段。
其使用也比較簡單,如果在MFC中的話,可在構造函數調用InitializeCriticalSection,在構造函數調用DeleteCriticalSection,在所需保護的代碼前調用EnterCriticalSection,在訪問完所需保護的資源後調用LeaveCriticalSection即可。

 

----------------例子:互斥對象------------------------------------------------

正確的結果是由20遞減到1,但是本程序會出現以下錯誤結果:
thread 1 sell ticket: 20
thread 1 sell ticket: 20
thread 2 sell ticket: 19
thread 1 sell ticket: 18
...
thread 2 sell ticket: 1
----------------------------------------------------------------------------------

 

----------------例子:事件對象------------------------------------------------

 

----------------例子:關鍵代碼段---------------------------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章