ace对战平台,Linux平台的ACE_mutex_t

ace对战平台,Linux平台的ACE_mutex_t
Linux平台mutex相关类型的定义主要是在文件OS_NS_Thread.h和os_include/os_pthread.h。在文件OS_NS_Thread.h的代码:
107 # if defined (ACE_HAS_PTHREADS) /// 这个注释其意思是把相关的类型定义移到了os_include/os_pthread.h中 108 // moved to pthread.h 109 # elif defined (ACE_HAS_STHREADS)
在文件os_include/os_pthread.h定义声明了一些类型:
234 # if !defined (ACE_LACKS_COND_T) 235 typedef pthread_mutex_t ACE_mutex_t; 236 typedef pthread_cond_t ACE_cond_t; 237 typedef pthread_condattr_t ACE_condattr_t; 238 typedef pthread_mutexattr_t ACE_mutexattr_t; 239 # endif /* ! ACE_LACKS_COND_T */ 240 typedef pthread_mutex_t ACE_thread_mutex_t; …………………………………………………………………… 291 # if !defined (ACE_HAS_STHREADS) 292 # if !defined (USYNC_THREAD) 293 # define USYNC_THREAD PTHREAD_PROCESS_PRIVATE 294 # endif /* ! USYNC_THREAD */ 295 # if !defined (USYNC_PROCESS) 296 # define USYNC_PROCESS PTHREAD_PROCESS_SHARED 297 # endif /* ! USYNC_PROCESS */ 298 # endif /* ACE_HAS_STHREADS */
Linux拥有condition类型,那么宏ACE_LACKS_COND_T是未定义的,因此235行到238行是有效的。宏ACE_HAS_STHREADS指的是拥有支持“Sun”系列的线程,Linux平台当然不是“Sun”系列的平台,因此292行到297行是有效的。
ACE_mutex_t可以用于进程间的也可发用于线程间的,具体由PTHREAD_PROCESS_SHARED 和PTHREAD_PROCESS_PRIVATE去指定。PTHREAD_PROCESS_SHARED 和PTHREAD_PROCESS_PRIVATE由别名USYNC_PROCESS和USYNC_THREAD所代替成为跨平台的名称。ACE_thread_mutex_t如其名字一样,它是专用于线程间的mutex。还有一种mutex是可以递归的,它的定义是在文件OS_NS_Thread.h:
505 typedef ACE_thread_mutex_t ACE_recursive_thread_mutex_t;
可见用于进程的、线程的或递归的mutex都是pthread_mutex_t类型,具体的使用是通过不同的参数指定去实现。Mutex相关接口的声明是在OS_NS_Thread.h文件,实现则定义在OS_NS_Thread.cpp和OS_NS_Thread.inl。接口的罗列和说明请参考 Window ACE Mutex相关,在这里只分析几个接口的实现:
/// 参数name和sa在平台Windows会用到,而Linux不会用到。 /// 参数lock_scope的值为USYNC_PROCESS或USYNC_THREAD,默 /// 认是USYNC_THREAD用于线程。 /// 参数lock_type表明此mutex是否是递归mutex 1771 int 1772 ACE_OS::mutex_init (ACE_mutex_t *m, 1773 int lock_scope, 1774 const char *name, 1775 ACE_mutexattr_t *attributes, 1776 LPSECURITY_ATTRIBUTES sa, 1777 int lock_type) 1778 { ………………………………………………………. /// 定义attribute局部变量 1792 pthread_mutexattr_t l_attributes; ………………………………………………………. /// 如果参数传过来的attribute指针为0就让它指向变量l_attributes。 1795 if (attributes == 0) 1796 attributes = &l_attributes; /// result是为了保存系统调用时的返回值,成功为0失败为其它值 1797 int result = 0; /// attr_init为0表示l_attributes没初始化,attr_init为1表示l_attributes已初始化。 1798 int attr_init = 0; // have we initialized the local attributes. 1799 1800 // _disibledevent=> parameter wasn't 1852 // originally set. /// 只有当参数的attributes没有被设置时,这个if语句才执行 1853 if (attributes == &l_attributes && attr_init) 1854 ::pthread_mutexattr_destroy (&l_attributes); 1855 1856 return result; ………………………………………………………. 1925 } /// 实现结束
1928行的ACE_OS::mutex_destroy的实现只是简单地调用pthread_mutex_destroy。ACE_mutex_t的其它接口的实现也与mutex_destroy类似只是简单地调用相关的系统调用实现。看来mutex相关的代码还是很简单的,只是其中的一些宏让人眼花罢了。
Tags: 

延伸阅读

最新评论

发表评论