模版和多态策略化加锁
关键词:策略化模式 模板策略化 多态策略化 策略化加锁模式 ACE BOOST C++ 设计模式
在ACE和BOOST的实现中都有大量的策略化加锁(Strategized Locking)的模式,这种模式能比较方便的让你的类兼容加锁和不加锁的两种情况。ACE大师Douglas C. Schmidt有一片专门的论文《Strategized Locking》对此做了介绍,国人Thzhang也对此问做过翻译《ACE策略化的加锁模式》。
本文的目的是介绍这种模式的两种实现方式模版参数和多态方式以外,同时介绍两者的优缺点。
模板参数(parameterized)策略化加锁
如果一个监控组件,同时要在多线程和单线程环境下使用,而且其使用的平率非常高,多线程下必须加锁,但如果因此而影响了单线程下的组件性能,是不合算的,但如果为每一种环境写一套代码显然不利于代码的重用。那么有没有方法兼容两种模式呢,这就是策略化加锁的模式。
策略化加锁的方法一般采用模版(ACE和BOOST都试用过类似方式)的方式完成中这个功能,这样带来的成本都在编译器,几乎没有什么性能影响。如下代码:
//ZEN_Null_Mutex是一种用于单线程下的策略锁,
class ZEN_Null_Mutex
{
public:
//锁定,其实什么也没有做
void lock()
{
}
//解锁,其实什么也没有做
void unlock()
{
}
}
//ZEN_Thread_Mutex是一种用于多线程下的策略锁,
class ZEN_Thread_Mutex
{
protected:
//线程锁
pthread_mutex_t lock_;
public:
//锁定, ZEN_OS是为为了跨平台封装的函数,这儿不展开,大家可以认为他就是mutex
void lock()
{
ZEN_OS::pthread_mutex_lock(&lock_);
}
//解锁,
void unlock()
{
ZEN_OS::pthread_mutex_unlock(&lock_);
}
}
//ZEN_Server_Statu