ACE下的ACE_Condition_Thread_Mutex和WIN32的EVENT比较以及ACE_Event

从《C++ NP V1》这本书上的描述,如果不仔细看很容易将ACE_Condition_Thread_Mutex误以为是WIN32当中的EVENT同样的东东,然后仔细揣摩书中的描述和相关文档,我们会发现这其实是两个毫不相关的东西。

首先,从ACE_Condition_Thread_Mutex这个名字当中我们可以知道,这个同步ACE对象其实是进程范围内的,而根据我们所知,WIN32的EVENT是内核对象,也就是可以做进程同步的系统范围对象。当然这只是初步的区别。

观察ACE_Condition_Thread_Mutex这个类的构造函数,我们发现他必须传递一个ACE_Thread_Mutex对象给他,再仔细看书中的描述,我们可以看到,在调用ACE_Condition_Thread_Mutex::wait()之前,我们必须先将mutex锁定(acquire)。而ACE_Condition_Thread_Mutex在wait过程中(也就是没有其他线程将其signal或者broadcast),实际上传递进去的mutex是被release的(关于这点,完全可以写个测试程序来进行验证,我这有测试程序),当condition对象被signal以后,wait调用返回,但是此时mutex被重新锁定,于是这里出现了一个初次使用经常会犯的错误,就是这里忘了将mutex重新释放,于是导致了死锁。这里推荐使用ACE_GUARD宏来处理这个mutex。

所以说,从上面两点来看,ACE_Condition_Thread_Mutex跟EVENT压根是两码事,特别是第二点,ACE的设计者大概是为了防止在mutex上造成死锁才设计成这样(毕竟mutex是作为一个变量传递进去的,很有可能在其他地方被重新使用)。

那么在ACE当中与WIN32的EVENT等同的东西是什么呢?应该是ACE_Event的两个子类:ACE_Manual_Event和ACE_Auto_Event,但是这两个类有一定的缺陷,我们可以看到文档当中的第一句话就讲了A wrapper around the Win32 event locking mechanism,这是一个for WIN32的wrapper,仔细看下面的文档,我们会发现,在非WIN32的Platform上,EVENT被模拟成进程范围内的东西,这又接近ACE_Condition_Thread_Mutex了(我没看源码,很有可能就是同一个东西),当然在WIN32上ACE_Event还是我们熟悉的那个Event,只能说如果需要移植那就尽量少用吧。

Portable implementation of an Event mechanism, which is native to Win32, but must be emulated on UNIX. All platforms support process-scope locking support. However, only Win32 platforms support global naming and system-scope locking support.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值