多線程同步機制的幾種方法


Critical Section
Critical section(臨界區)用來實現“排他性占有”。適用范圍是單一進程
的各線程之間。它是:
 一個局部性對象,不是一個核心對象。
 快速而有效率。
 不能夠同時有一個以上的 critical section 被等待。
 無法偵測是否已被某個線程放棄。

可以實現線程間互斥,不能用來實現同步。

 

Semaphore
Semaphore 被用來追蹤有限的資源。它是:
一個核心對象。

 沒有擁有者。

 可以具名,因此可以被其他進程開啟。
 可以被任何一個線程釋放(released)。

既能實現線程間互斥,也能實現線程間同步。

在跨進程中使用時,如果擁有信號量的線程意外結束,其它進程不會收到通知。

 

Mutex
Mutex 是一個核心對象,可以在不同的線程之間實現“排他性占有”,甚
至即使那些線程分屬不同進程。它是:
一個核心對象。
 如果擁有 mutex 的那個線程結束,則會產生一個 “abandoned” 錯
誤信息。
i可以具名,因此可以被其他進程開啟。
只能被擁有它的那個線程釋放(released)。

在跨進程中使用時,如果擁有互斥器的進程意外結束,其它進程會收到一個WAIT_ABANDOEND消息。


Event 
Event object 通常使用於 overlapped I/O,或用來設計某些自定
義的同步對象。它是:
 一個核心對象。
可是用來實現線程的互斥與同步。
可以具名,因此可以被其他進程開啟。

在跨進程中使用時,如果擁有信號量的線程意外結束,其它進程也不會受到通知。

 

 

注意:臨界區和互斥器都有“線程所有權”的概念,所以它們是不能用來實現線程間的同步的,只能用來實現互斥。原因是由於創建臨界區或互斥器的線程可以不用等待LeaveCriticalSection(),SetEvent()就可以無條件進入保護的程序段,因為它擁有這個權利。另外,互斥器可以很好的處理”遺棄“操作。若線程在未釋放對向象的時候就意外終止的,其它線程可以等待到一個WAIT_ABANDONED_0。但是事件和信號量都不能做到。

事件和信號量都可以實現線程和進程間的互斥和同步。

就使用效率來說,臨界區的效率是最高的,因為它不是內核對象,而其它的三個都是核心對象,要借助操作系統來實現,效率相對來說就比較低。

但如果要跨進程使用還是要用到互斥器、事件對象和信號量。

總之:在設計時,首先盡量不要使用全局變量,如果不得以先然后考慮使用Inter...()函數,然后在是臨界區對象,最后才是事件、互斥器、信號量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM