Windows同步對象Event和Linux的條件變數

來源:互聯網
上載者:User

最近在看一些同步對象類比的東東,特別對在Windows下如何類比條件變數折騰了很久。

1 Windows同步對象Event

微軟有一個很有意思的同步對象,某種程度上和Linux的條件變數很相似。但秉承微軟一貫的作風,有些地方設計的又有點怪異。Event通過函數CreateMutex建立,可以分為手動模式和自動模式兩種模式,兩種模式下表現迥異。和其他同步對象一樣,在WaitForSingleObject或者WaitForMultipleObjects等待激發。激發(取消激發)法有3個函數SetEvent,ResetEvent,PulseEvent根據模式不同給出說明如下表:

 

自動模式

手動模式

SetEvent

放過一個等待線程,

將Event調為激發態,放過一個等待線程,而後自動調回非激發態

一直放過等待

將Event調為激發態,

ResetEvent

無用

停止放過線程

將Event調為非激發態

PulseEvent

一次放過一個等待的線程,在這種模式下等同與SetEvent

放過所有的等待的線程一次,

將Event調為激發態,放過所有的等待的線程一次,然後調回非激發態

所以綜合看來大致看來Event大致有幾種使用模式,

自動模式下的WaitForSingleObject + SetEvent,(幹一件事後)開一次們放過一個。

手段模式下的WaitForSingleObject + SetEvent + ResetEvent,SetEvent後開啟大門,放一批人進來,然後用ResetEvent手動關閉大門。

手段模式下的WaitForSingleObject + PulseEvent ,(幹一件事後),廣播給所有等在門外的人,讓他們進來。

其實你把這些功能組合起來看,Event這是個很有意思的東東而且萬分強大,某種程度也滿足了我們很多同步的需求。

2 Linux(UNIX)的條件變數Condition Variable

條件變數是一個更加複雜的東東,他在等待的基礎上又糅合了等待條件。條件變數的對象用函數初始化,在pthread_cond_wait函數上等待,pthread_cond_signal激發後,解除一個等待線程的阻塞,pthread_cond_broadcast廣播解除所有等待線程的阻塞(一次)。

3 兩者的相似之處

看了上面的說明,應該可以發現Windows的Event和pthread的條件變數很像,

某種程度上,自動模式Event的SetEvent很像條件變數的pthread_cond_signal,手動模式的Event的PulseEvent很像廣播pthread_cond_broadcast,

但你要直接拿Event來類比條件變數又不行了,為啥。因為你不可能讓一個Event對象同時擁有手動觸發和自動觸發模式,你奈他何。也許如果微軟把PulseEvent在手動模式的功能放到自動模式,會讓大家移植的時候更加舒服一點。

關於條件變數在Windows的類比,如果大家有興趣而且有關心一下ACE或者pthread-win32或者BOOST(BOOST是學習pthread-win32的),但要看懂的pthread-win32類比實在是一個蛋疼的事情。

而因為一般情況下大家也不會混用pthread_cond_broadcast和pthread_cond_signal,所以實現一個簡單一點的類比是不是更好一點?

【本文作者是雁渡寒潭,本著自由的精神,你可以在無盈利的情況完整轉載此文 檔,轉載時請附上BLOG連結:http://www.cnblogs.com/fullsail/,否則每字一元,每圖一百不講價。對Baidu文庫加價一倍】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.