Windows同步对象Event和Linux的条件变量

最近在看一些同步对象模拟的东东,特别对在Windows下如何模拟条件变量折腾了好久。函数

1 Windows同步对象Event

微软有一个颇有意思的同步对象,某种程度上和Linux的条件变量很类似。但秉承微软一向的做风,有些地方设计的又有点怪异。Event经过函数CreateMutex建立,能够分为手动模式和自动模式两种模式,两种模式下表现迥异。和其余同步对象同样,在WaitForSingleObject或者WaitForMultipleObjects等待激发。激发(取消激发)法有3个函数SetEvent,ResetEvent,PulseEvent根据模式不一样给出说明以下表:学习

 

自动模式spa

手动模式线程

SetEvent设计

放过一个等待线程,对象

将Event调为激发态,放过一个等待线程,然后自动调回非激发态ip

一直放过等待ci

将Event调为激发态,同步

ResetEventit

无用

中止放过线程

将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,因此实现一个简单一点的模拟是否是更好一点?

(本身后面的模拟发现Event用于模拟条件变量仍是有必定的麻烦的,后面专门写文章说明吧。)

相关文章
相关标签/搜索