ACE_Thread_Mutex和ACE_Process_Mutex超时等待机制

转自 :http://tb.blog.csdn.net/TrackBack.aspx?PostId=657745


ACE_Thread_MutexACE_Process_Mutex超时等待机制                                 LYNCH

问题(windows 2003运行和测试环境、VC++6.0ACE5.4

因项目需求,使用了ACE_Thread_Mutex,在调用函数acquire(timeout)时失败,错误码是40

       特作一下测试程序:

#include <stdlib.h>

#include <stdio.h>

#include <ace/thread_mutex.h>

#include <ace/time_value.h>

 

int main(int argc,char* argv[])

{

       ACE_Thread_Mutex mutex;

       ACE_Time_Value now(0,1000000);

       mutex.acquire();

       if (mutex.acquire(now)==-1)

       {

              printf("errno=%d,ENOTSUP=%d!/n",errno,ENOTSUP);

              return 1;

       }

       return 1;

}

      mutex.acquire(now)结果为-1,错误码为40,定义为ENOTSUP,又或者ENOSYS.定义见os_errno.h, look:

      #if !defined (ENOTSUP)

# define ENOTSUP ENOSYS  /* Operation not supported. */

#endif /* !ENOTSUP */

 

分析

      什么叫Operation not supported,呵呵,即系统不支持这种特定操作。因为ACE是跨平台的,而ACE_Thread_Mutexwindows下究竟是使用windows的何种同步机制实现?这是非常关键的问题。有源码,直接找吧。

      ACE_Thread_Mutex定义于Thread_Mutex.h。看构造函数

    ACE_OS::thread_mutex_init定义于OS_NS_Thread.h.

      其中有::InitializeCriticalSection,这不就是临界区吗??<ACE_HAS_WTHREADS>

回过头来,在类ACE_Thread_Mutex中,成员lock_ACE_thread_mutex_t类型的,我们找找这个的定义.在文件OS_NS_Thread.h

WindowsCriticalSection只是进程空间的一段用来处理共享资源问题的程序代码,并没有超时的概念。

最后我们来看看函数acquire的实现代码。Thread_Mutex.h

ACE_OS::thread_mutex_lock的实现,在OS_NS_Thread.inl

 

这些彻底清楚了,有超时的acquire函数最终是返回ACE_NOTSUP_RETURN(-1),设置errno码为ENOTSUP

 

扩展

      ACE_Thread_Mutex不能实现超时,那么ACE_Process_Mutex呢?我们只需要看看该类使用windows下的哪种同步机制就晓得了。

      原来,ACE_Process_Mutex是通过CreateMutex创建Mutex核心对象,使用WaitSingleObject实现超时机制。

 

Win32Mutexcritical section比较

      做相同的事情,运作还是有些区别:

(1)      锁住一个未被拥有的mutex所花的时间几乎是使用critical section100倍;

(2)      Mutex可以跨进程,critical section只能在同一进程使用

(3)      等待一个mutex,你可以指定“等待的时间”,但是对于critical section不行。

 



转自 :http://tb.blog.csdn.net/TrackBack.aspx?PostId=657745

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值