设为首页 加入收藏

TOP

Windows同步对象Event和Linux的条件变量
2014-11-24 07:17:39 来源: 作者: 【 】 浏览:0
Tags:Windows 同步 对象 Event Linux 条件 变量

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


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


所以综合看来大致看来Event大致有几种使用模式,


自动模式下的WaitForSingleObject + SetEvent,(干一件事后)开一次们放过一个。


手段模式下的WaitForSingleObject + SetEvent + ResetEvent,SetEvent后打开大门,放一批人进来,然后用ResetEvent手动关闭大门。


手段模式下的WaitForSingleObject + PulseEvent ,(干一件事后),广播给所有等在门外的人,让他们进来。


其实你把这些功能组合起来看,Event这是个很有意思的东东而且万分强大,某种程度也满足了我们很多同步的需求。


条件变量是一个更加复杂的东东,他在等待的基础上又糅合了等待条件。条件变量的对象用函数初始化,在pthread_cond_wait函数上等待,pthread_cond_signal激发后,解除一个等待线程的阻塞,pthread_cond_broadcast广播解除所有等待线程的阻塞(一次)。


看了上面的说明,应该可以发现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用于模拟条件变量还是有一定的麻烦的,后面专门写文章说明吧。)


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 项目编译过程 下一篇Java实现把文件上传至ftp服务器

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·MySQL 安装及连接-腾 (2025-12-25 06:20:28)
·MySQL的下载、安装、 (2025-12-25 06:20:26)
·MySQL 中文网:探索 (2025-12-25 06:20:23)
·Shell脚本:Linux Sh (2025-12-25 05:50:11)
·VMware虚拟机安装Lin (2025-12-25 05:50:08)