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

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

能夠實現線程間互斥,不能用來實現同步。函數

 

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

 沒有擁有者。線程

 能夠具名,所以能夠被其餘進程開啓。
 能夠被任何一個線程釋放(released)。設計

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

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

 

Mutex
Mutex 是一個核心對象,能夠在不一樣的線程之間實現「排他性佔有」,甚
至即便那些線程分屬不一樣進程。它是:
一個核心對象。
 若是擁有 mutex 的那個線程結束,則會產生一個 「abandoned」 錯
誤信息。
i能夠具名,所以能夠被其餘進程開啓。
只能被擁有它的那個線程釋放(released)。事件

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


Event 
Event object 一般使用於 overlapped I/O,或用來設計某些自定
義的同步對象。它是:
 一個核心對象。
但是用來實現線程的互斥與同步。
能夠具名,所以能夠被其餘進程開啓。同步

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

 

 

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

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

就使用效率來講,臨界區的效率是最高的,由於它不是內核對象,而其它的三個都是核心對象,要藉助操做系統來實現,效率相對來講就比較低。

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

總之:在設計時,首先儘可能不要使用全局變量,若是不得以先而後考慮使用Inter...()函數,而後在是臨界區對象,最後纔是事件、互斥器、信號量。

相關文章
相關標籤/搜索