首先介绍一下ACE单体实例的概念
所谓单体实例就是一个相当于一个静态全局对象,其生命周期由ACE机制自己管理,所以在main函数中绝对不要调用exit之类的系统底层函数退出主函数,否则会导致这些单体实例不会被释放,默认,ACE会在程序开始时生成一些很常用或者特殊的单体实例
你也可以通过模板技术生成自己的单体类,如下:
#include "ace/Auto_Event.h"
#include "ace/Singleton.h"
#include "ace/Thread_Manager.h"
typedef ACE_Singleton <ACE_Auto_Event, ACE_Thread_Mutex> EVENT;
上面代码定义了一个 ACE_Auto_Event 类型的单体类,其锁机制是采用线程互斥机制
要获得单体类的实例,需调用 instance() 方法,如:
EVENT::instance ()->wait ()
当然,要使编译器理解这个模板,需要加入如下代码帮助编译器理解它:
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Singleton<ACE_Auto_Event, ACE_Thread_Mutex>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate ACE_Singleton<ACE_Auto_Event, ACE_Thread_Mutex>
#elif defined (__GNUC__) && (defined (_AIX) || defined (__hpux))
template ACE_Singleton<ACE_Auto_Event, ACE_Thread_Mutex> *
ACE_Singleton<ACE_Auto_Event, ACE_Thread_Mutex>::singleton_;
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
ACE原语:
可以用如下代码定义一个所操作的的动作是原子动作,例如
ACE_Atomic_Op<ACE_Thread_Mutex, int> count;
上面代码定义了变量count,锁机制采用线程互斥机制,这样的话以后对count变量进行比如++,--的操作就不必考虑多线程的问题了
锁和条件变量:
锁可以确保资源在某一时刻只被一个线程操作
条件变量一般需跟锁配合使用
相关的常用类如下:
ACE_Thread_Mutex 类:
acquire(超时设置) 方法:获得锁的使用权,如在指定时间没有获得,返回-1
release 方法:释放锁的使用权
acquire_read() 获得锁的读权
acquire_write() 获得锁的写权
ACE_Condition_Thread_Mutex 类
ACE_Condition_Thread_Mutex(锁) :构造一个锁的条件变量
wait() 等待条件成立
signal() 发送条件成立信号