您的位置:首页 > 运维架构 > Linux

阅读ISE 复习linux多线程开发时需使用的锁

2017-06-23 15:53 218 查看

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.继承、友元类、抽象类等的实践。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ise c++