1、缘由
以项目带动学习,主要学习C++一些特性,复习linux编程中锁、信号、条件变量等。
2、ISE点示例
///
// class AutoInvokable/AutoInvoker - 自动被调对象/自动调用者
//
// 说明:
// 1. 这两个类联合使用,可以起到和 "智能指针" 类似的作用,即利用栈对象自动销毁的特性,在栈
// 对象的生命周期中自动调用 AutoInvokable::invokeInitialize() 和 invokeFinalize()。
// 此二类一般使用在重要资源的对称性操作场合(比如加锁/解锁)。
// 2. 使用者需继承 AutoInvokable 类,重写 invokeInitialize() 和 invokeFinalize()
// 函数。并在需要调用的地方定义 AutoInvoker 的栈对象。
class AutoInvokable
{
public:
friend class AutoInvoker;
virtual ~AutoInvokable() {}
protected:
virtual void invokeInitialize() {}
virtual void invokeFinalize() {}
};
class AutoInvoker : boost::noncopyable
{
public:
explicit AutoInvoker(AutoInvokable& object)
{ object_ = &object; object_->invokeInitialize(); }
explicit AutoInvoker(AutoInvokable *object)
{ object_ = object; if (object_) object_->invokeInitialize(); }
virtual ~AutoInvoker()
{ if (object_) object_->invokeFinalize(); }
private:
AutoInvokable *object_;
};
///
// class AutoLocker - 线程自动互斥类
//
// 说明:
// 1. 此类利用C++的栈对象自动销毁的特性,在多线程环境下进行局部范围临界区互斥;
// 2. 使用方法: 在需要互斥的范围中以局部变量方式定义此类对象即可;
//
// 使用范例:
// 假设已定义: Mutex mutex_;
// 自动加锁和解锁:
// {
// AutoLocker locker(mutex_);
// //...
// }
typedef AutoInvoker AutoLocker;
///
// class BaseMutex - 互斥器基类
class BaseMutex:
public AutoInvokable,
boost::noncopyable
{
public:
virtual void lock() = 0;
virtual void unlock() = 0;
protected:
virtual void invokeInitialize() { lock(); }
virtual void invokeFinalize() { unlock(); }
};
///
// class Mutex - 线程互斥类
//
// 说明:
// 1. 此类用于多线程环境下临界区互斥,基本操作有 lock、unlock;
// 2. 线程内允许嵌套调用 lock,嵌套调用后必须调用相同次数的 unlock 才可解锁;
class Mutex : public BaseMutex
{
public:
Mutex();
virtual ~Mutex();
virtual void lock();
virtual void unlock();
private:
pthread_mutex_t mutex_;
friend class Condition;
};
3、可以借鉴的技术点
a.利用函数栈的特性,类的生命周期只在函数作用域内,进入函数时压栈调用构造函数上锁,离开函数时栈空间自动回收
调用析构函数解锁,方便成对使用锁,防止遗忘。
b.继承、友元类、抽象类等的实践。