Critical SectionCritical section(臨界區(qū))用來實(shí)現(xiàn)“排他性占有”。適用范圍是單一進(jìn)程的各線程之間。它是:一個(gè)局部性對(duì)象,不是一個(gè)核心對(duì)象。快速而有效率。不能夠同時(shí)有一個(gè)以上的 critical section 被等待。無法偵測(cè)是否已被某個(gè)線程放棄。
可以實(shí)現(xiàn)線程間互斥,不能用來實(shí)現(xiàn)同步。
SemaphoreSemaphore 被用來追蹤有限的資源。它是:一個(gè)核心對(duì)象。
沒有擁有者。
可以具名,因此可以被其他進(jìn)程開啟。可以被任何一個(gè)線程釋放(released)。
既能實(shí)現(xiàn)線程間互斥,也能實(shí)現(xiàn)線程間同步。
在跨進(jìn)程中使用時(shí),如果擁有信號(hào)量的線程意外結(jié)束,其它進(jìn)程不會(huì)收到通知。
MutexMutex 是一個(gè)核心對(duì)象,可以在不同的線程之間實(shí)現(xiàn)“排他性占有”,甚至即使那些線程分屬不同進(jìn)程。它是:一個(gè)核心對(duì)象。如果擁有 mutex 的那個(gè)線程結(jié)束,則會(huì)產(chǎn)生一個(gè) “abandoned” 錯(cuò)誤信息。i可以具名,因此可以被其他進(jìn)程開啟。只能被擁有它的那個(gè)線程釋放(released)。
在跨進(jìn)程中使用時(shí),如果擁有互斥器的進(jìn)程意外結(jié)束,其它進(jìn)程會(huì)收到一個(gè)WAIT_ABANDOEND消息。
EventEvent object 通常使用于 overlapped I/O,或用來設(shè)計(jì)某些自定義的同步對(duì)象。它是:一個(gè)核心對(duì)象。可是用來實(shí)現(xiàn)線程的互斥與同步。可以具名,因此可以被其他進(jìn)程開啟。
在跨進(jìn)程中使用時(shí),如果擁有信號(hào)量的線程意外結(jié)束,其它進(jìn)程也不會(huì)受到通知。
注意:臨界區(qū)和互斥器都有“線程所有權(quán)”的概念,所以它們是不能用來實(shí)現(xiàn)線程間的同步的,只能用來實(shí)現(xiàn)互斥。原因是由于創(chuàng)建臨界區(qū)或互斥器的線程可以不用等待LeaveCriticalSection(),SetEvent()就可以無條件進(jìn)入保護(hù)的程序段,因?yàn)樗鼡碛羞@個(gè)權(quán)利。另外,互斥器可以很好的處理”遺棄“操作。若線程在未釋放對(duì)向象的時(shí)候就意外終止的,其它線程可以等待到一個(gè)WAIT_ABANDONED_0。但是事件和信號(hào)量都不能做到。
事件和信號(hào)量都可以實(shí)現(xiàn)線程和進(jìn)程間的互斥和同步。
就使用效率來說,臨界區(qū)的效率是最高的,因?yàn)樗皇莾?nèi)核對(duì)象,而其它的三個(gè)都是核心對(duì)象,要借助操作系統(tǒng)來實(shí)現(xiàn),效率相對(duì)來說就比較低。
但如果要跨進(jìn)程使用還是要用到互斥器、事件對(duì)象和信號(hào)量。
總之:在設(shè)計(jì)時(shí),首先盡量不要使用全局變量,如果不得以先然后考慮使用Inter...()函數(shù),然后在是臨界區(qū)對(duì)象,最后才是事件、互斥器、信號(hào)量。
新聞熱點(diǎn)
疑難解答
圖片精選