ACE_Thread_Mutex和ACE_Process_Mutex超时等待机制 LYNCH
问题(windows 2003运行和测试环境、VC++6.0、ACE5.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_Mutex在windows下究竟是使用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
中
Windows
的
CriticalSection
只是进程空间的一段用来处理共享资源问题的程序代码,并没有超时的概念。
最后我们来看看函数
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
实现超时机制。
Win32
的
Mutex
和
critical section
比较
做相同的事情,运作还是有些区别:
(1)
锁住一个未被拥有的
mutex
所花的时间几乎是使用
critical section
的
100
倍;
(2)
Mutex
可以跨进程,
critical section
只能在同一进程使用
(3)
等待一个
mutex
,你可以指定“等待的时间”,但是对于
critical section
不行。
转自 :http://tb.blog.csdn.net/TrackBack.aspx?PostId=657745