Windows同步对象Event和Linux的条件变量
来源:互联网 发布:计算机c语言自学教程 编辑:程序博客网 时间:2024/05/16 17:24
最近在看一些同步对象模拟的东东,特别对在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,所以实现一个简单一点的模拟是不是更好一点?
(自己后面的模拟发现Event用于模拟条件变量还是有一定的麻烦的,后面专门写文章说明把。)
【本文作者是雁渡寒潭,本着自由的精神,你可以在无盈利的情况完整转载此文 档,转载时请附上BLOG链接:http://blog.csdn.com/fullsail/,否则每字一元,每图一百不讲价。对Baidu文库加价一倍】
- Windows同步对象Event和Linux的条件变量
- linux线程同步:互斥量和条件变量的使用
- linux同步-条件变量
- linux 条件变量--同步
- 同步和条件变量
- linux下实现同步的---条件变量
- linux的条件变量和windows的信号量
- Linux线程浅析[线程的同步和互斥之线程同步的条件变量pthread_cond_t]
- Linux下线程同步对象(3)——条件变量
- Linux下线程同步对象(3)——条件变量
- Linux多线程编程之同步对象编程:条件变量
- windows 使用关键段和条件变量实现的生产者和消费者线程同步
- linux多线程-----同步对象(互斥量、读写锁、条件变量)的属性
- 随笔之POSIX cond和Windows同步对象Event的讨论
- Windows核心编程之 用户模式下的线程同步 读写锁和条件变量
- Linux 线程同步---条件变量
- Linux 线程同步---条件变量
- linux 同步技术-条件变量
- PreviewHandler用法(二)
- 鸟菜呀鸟菜,入门级ajax调用
- 当你输入一个网址的时候,实际会发生什么?
- 深入理解Oracle索引(7):用实验数据观察从B-tree索引→复合索引→Bitmap索引所消费的CPU和I/O
- 好奇号登陆火星
- Windows同步对象Event和Linux的条件变量
- SHA1和MD5算法详解和源码
- PreviewHandler用法(三)
- 【我当项目经理那些年】建设项目团队—主题晨会
- Win32工程引用gdiplus.h编译错误解决方案
- 英雄联盟服务器正忙请稍后再试解决办法
- makefile 中的 wildcard 与 patsubst 函数
- Android数据存储方式(一)文件
- 在win7中chm打不开的最佳方法