ace对战平台,Windows平台的ACE_mutex_t

ace对战平台,Windows平台的ACE_mutex_t
为了统一OS的接口和方便操作,ACE对 Windows平台的Mutex做了重新定义和一些封装。ACE中的Mutex有用于进程的也有用于线程,这个由使用者去决定。相关的类型定义和接口声明在文件OS_NS_Thread.h中。
247 typedef CRITICAL_SECTION ACE_thread_mutex_t; 248 249 typedef struct 250 { 251 /// Either USYNC_THREAD or USYNC_PROCESS 252 int type_; 253 union 254 { 255 HANDLE proc_mutex_; 256 CRITICAL_SECTION thr_mutex_; 257 }; 258 } ACE_mutex_t; …………. 389 struct ACE_Export ACE_mutexattr_t 390 { 391 int type; 392 };
ACE_thread_mutex_t如其名字一样,专用于线程。在定义中可见ACE_thread_mutex_t 就是CRITICAL_SECTION的别名。那么我们可以想像,为ACE_thread_mutex_t提供的相关接口的实现就是操作CRITICAL_SECTION。 ACE_mutex_t可用于线程也可用于进程,当成员type_为USYNC_THREAD时,ACE_mutex_t用于线程;为USYNC_PROCESS时ACE_mutex_t用于进程。由union成员可知,使用线程时ACE_mutex_t相关操作是操作CRITICAL_SECTION。而使用进程时ACE_mutex_t使用的是Windows Mutex内核对象相关的操作。 另外在线程环境中有些mutex还支持递归的特性。
505 typedef ACE_thread_mutex_t ACE_recursive_thread_mutex_t; 506 # if defined (ACE_WIN32) 507 // Windows has recursive mutexes, but doesn't have condition variables, 508 // so there's no built-in support for this. Thus, the condition-related 509 // unlock/relock is augmented in ACE. // Windows平台支持递归mutex,但没有condition类型。因此这个没有平台内建的支持 // ACE在这里扩充平台的功能支持condition相关的unlock/relock。 510 struct ACE_recursive_mutex_state 511 { 512 // _disibledevent=> 1065 namespace ACE_OS { …………………………………. // 销毁mutex 1237 extern ACE_Export 1238 int mutex_destroy (ACE_mutex_t *m); 1239 // mutex_init有ansi和unicode两个版本,以参数name作区别。 // lock_scope表明ACE_mutex_t是用于进程还是线程,默认是线程。 // 代码行:741 #define ACE_DEFAULT_SYNCH_TYPE USYNC_THREAD // 当mutex是用于进程时,name和sa参数才会在创建mutex内核对象时用到 // lock_type没有用到 1240 extern ACE_Export 1241 int mutex_init (ACE_mutex_t *m, 1242 int lock_scope = ACE_DEFAULT_SYNCH_TYPE, 1243 const char *name = 0, 1244 ACE_mutexattr_t *arg = 0, 1245 LPSECURITY_ATTRIBUTES sa = 0, 1246 int lock_type = 0); 1247 // unicode版本 1248 #if defined (ACE_HAS_WCHAR) 1249 extern ACE_Export 1250 int mutex_init (ACE_mutex_t *m, 1251 int lock_scope, 1252 const wchar_t *name, 1253 ACE_mutexattr_t *arg = 0, 1254 LPSECURITY_ATTRIBUTES sa = 0, 1255 int lock_type = 0); 1256 #endif /* ACE_HAS_WCHAR */ 1257 1258 /// Win32 note: Abandoned mutexes are not treated differently. 0 is 1259 /// returned since the calling thread does get the ownership. // Win32注意:Abandoned mutex没有被特别地对待。当线程获取到锁是返回0。 1260 extern ACE_Export 1261 int mutex_lock (ACE_mutex_t *m); 1262 1263 /// This method is _disibledevent=> 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 { …………………………………. 1867 # elif defined (ACE_HAS_WTHREADS) // 在ACE_mutex_t存储锁范围 1868 m->type_ = lock_scope; 1869 1870 SECURITY_ATTRIBUTES sa_buffer; 1871 SECURITY_DESCRIPTOR sd_buffer; 1872 switch (lock_scope) 1873 { // 如果锁范围是进程就创建mutex内核对象,ACE_mutex_t存储了创建的句柄 // 这个句柄会在不使用时,也就是在ACE_OS::mutex_destroy中会用到。 1874 case USYNC_PROCESS: …………………………………………………………….. 1883 m->proc_mutex_ = 1884 ::CreateMutexA (ACE_OS::default_win32_security_attributes_r 1885 (sa, &sa_buffer, &sd_buffer), 1886 FALSE, 1887 name); ………………………………………………………….. 1889 if (m->proc_mutex_ == 0) 1890 ACE_FAIL_RETURN (-1); 1891 else 1892 { 1893 // Make sure to set errno to ERROR_ALREADY_EXISTS if necessary. 1894 ACE_OS::set_errno_to_last_error (); 1895 return 0; 1896 } // 如果锁范围是线程就交给ACE_OS::thread_mutex_init去处理。 1897 case USYNC_THREAD: 1898 return ACE_OS::thread_mutex_init (&m->thr_mutex_, 1899 lock_type, 1900 name, 1901 attributes); // 到了default说明锁范围的值有误 1902 default: 1903 errno = EINVAL; 1904 return -1; 1905 } …………………………………. 1925 } // 实现结束
很简单!不是吗?看这个实现时,再回头看看ACE_mutex_t是怎么样定义的,就更加一目了然了。这个是ansi版本的实现,unicode版本的实现也类似,其实现甚至更简单就不再赘述。与ACE_OS::mutex_init相反的是ACE_OS::mutex_destroy:
1927 int 1928 ACE_OS::mutex_destroy (ACE_mutex_t *m) 1929 { ………………………………………… 1939 # elif defined (ACE_HAS_WTHREADS) // 根据ACE_mutex_t所属的锁范围类型进行处理 1940 switch (m->type_) 1941 { // 如果锁范围是进程,用CloseHandle关闭句柄 1942 case USYNC_PROCESS: 1943 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::CloseHandle (m->proc_mutex_), 1944 ace_result_), 1945 int, -1); // 如果锁范围是线程,就交给ACE_OS::thread_mutex_destroy处理 1946 case USYNC_THREAD: 1947 return ACE_OS::thread_mutex_destroy (&m->thr_mutex_); 1948 default: 1949 errno = EINVAL; 1950 return -1; 1951 } ………………………………………… 1960 } // 实现结束
我们使用mutex主要是为了上锁和解锁进行互斥访问共享资源,其实现如下:
2011 int 2012 ACE_OS::mutex_lock (ACE_mutex_t *m) 2013 { …………………………………… 2024 # elif defined (ACE_HAS_WTHREADS) 2025 switch (m->type_) 2026 { // 如果是进程范围的锁,就用WaitForSingleObject永远(INFINITE)等待 // 直到获取到锁为止。 2027 case USYNC_PROCESS: 2028 switch (::WaitForSingleObject (m->proc_mutex_, INFINITE)) 2029 { 2030 // 2031 // Timeout can't occur, so don't bother checking... 2032 // 超时不会出现,所以不用检测… 2033 case WAIT_OBJECT_0: 2034 case WAIT_ABANDONED: 2035 // We will ignore abandonments in this method 2036 // Note that we still hold the lock // 在此方法中我们将忽略ABANDONED的情况 // 注意到这里,返回WAIT_OBJECT_0或WAIT_ABANDONED我们都已获取到锁 2037 return 0; 2038 default: 2039 // This is a hack, we need to find an appropriate mapping... // 这是一个处理错误的方法,我们需要找到一种合适的映射... 2040 ACE_OS::set_errno_to_last_error (); 2041 return -1; 2042 } 2043 case USYNC_THREAD: 2044 return ACE_OS::thread_mutex_lock (&m->thr_mutex_); 2045 default: 2046 errno = EINVAL; 2047 return -1; 2048 } …………………………………… 2057 } // 实现结束 2288 int 2289 ACE_OS::mutex_unlock (ACE_mutex_t *m) 2290 { ………………………………….. 2301 # elif defined (ACE_HAS_WTHREADS) 2302 switch (m->type_) 2303 { // 如果ACE_mutex_t用于进程就用ReleaseMutex解锁 2304 case USYNC_PROCESS: 2305 ACE_WIN32CALL_RETURN (ACE_ADAPT_RETVAL (::ReleaseMutex (m->proc_mutex_), 2306 ace_result_), 2307 int, -1); // 如果ACE_mutex_t用于线程就调用ACE_OS::thread_mutex_unlock处理 2308 case USYNC_THREAD: 2309 return ACE_OS::thread_mutex_unlock (&m->thr_mutex_); 2310 default: 2311 errno = EINVAL; 2312 return -1; 2313 } ………………………………….. 2322 } // 实现结束
ACE_mutex_t的其它接口的实现都已上面几个接口的实现类似,同样ACE_thread_mutex_t、ACE_recursive_thread_mutex_t的接口实现与ACE_mutex_t实现类似都一样,扒开不相关的宏阅读起来都十分的,到此就结束对mutex相关的代码分析。
Tags:  mutex ace对战平台

延伸阅读

最新评论

发表评论