最近在看一些同步对象模拟的东东,特别对在Windows下如何模拟条件变量折腾了很久。
1 Windows同步对象Event
微软有一个很有意思的同步对象,某种程度上和Linux的条件变量很相似。但秉承微软一贯的作风,有些地方设计的又有点怪异。Event通过函数CreateMutex创建,可以分为手动模式和自动模式两种模式,两种模式下表现迥异。和其他同步对象一样,在WaitForSingleObject或者WaitForMultipleObjects等待激发。激发(取消激发)法有3个函数SetEvent,ResetEvent,PulseEvent根据模式不同给出说明如下表:
| 自动模式 |
手动模式 |
|
| SetEvent |
放过一个等待线程, 将Event调为激发态,放过一个等待线程,而后自动调回非激发态 |
一直放过等待 将Event调为激发态, |
| ResetEvent |
无用 |
停止放过线程 将Event调为非激发态 |
| PulseEvent |
一次放过一个等待的线程,在这种模式下等同与 |

本文探讨了Windows下的Event同步对象与Linux的条件变量Condition Variable的相似性和差异。Event分为自动和手动模式,提供了多种同步机制。条件变量则在等待基础上结合了等待条件,可以通过signal和broadcast操作。尽管两者在某些方面相似,但在模拟条件变量时,Event存在局限性,因为不能同时具备两种模式。作者提到了模拟条件变量的一些挑战,并暗示后续将详细讨论这些问题。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



