POSIX pthread_mutex_t 的简单封装
2014-02-14 16:44
330 查看
代码如下:
Foo() 函数中,locker 会在构造器中执行 lock 动作,在析构器中执行 unlock 动作。其实这种做法有个专有的名称,叫做RAII(Resource Acquisition Is Initialization),或者
Stack unwind mechanism。
即使在action() 函数中抛出异常了,在 Foo() 退栈时,必定会执行 locker 的析构函数,也必定会执行 unlock 动作,因此比下面的代码更安全:
在写类似上面的代码时,一定要注意 mutex 要保护的代码,如 action() 函数,是否会抛出异常。如果会抛出异常,上面的代码就会出问题。因此还是建议用 C++ 语言特性保证的方式来做lock / unlock。
【注意】
上面的 CAutoLocker 类中,成员变量 m_mutex 必须是 pthread_mutex_t 的引用,这样才能确保每次调用 CAutoLocker locker(s_lock) 的时候,locker::m_mutex 都是同一份 mutex。如果去掉引用符“&”,则每次执行 CAutoLocker locker(s_lock) 的时候,m_mutex 实际上都是一个不同的 mutex,具体见《pthread_mutex_t
变量不建议做复制操作》。上面代码中的
class CAutoLocker { public: CAutoLocker(pthread_mutex_t& _mutex): m_mutex(_mutex) { pthread_mutex_lock(&m_mutex); } ~CAutoLocker() { pthread_mutex_unlock(&m_mutex); } private: void operator = (const CAutoLocker&); CAutoLocker(const CAutoLocker&); pthread_mutex_t& m_mutex; }; static pthread_mutex_t s_lock = PTHREAD_MUTEX_INITIALIZER; void Foo() { CAutoLocker locker(s_lock); action(); }
Foo() 函数中,locker 会在构造器中执行 lock 动作,在析构器中执行 unlock 动作。其实这种做法有个专有的名称,叫做RAII(Resource Acquisition Is Initialization),或者
Stack unwind mechanism。
即使在action() 函数中抛出异常了,在 Foo() 退栈时,必定会执行 locker 的析构函数,也必定会执行 unlock 动作,因此比下面的代码更安全:
void Foo() { pthread_mutex_lock(&s_lock); action(); pthread_mutex_unlock(&s_lock); }
在写类似上面的代码时,一定要注意 mutex 要保护的代码,如 action() 函数,是否会抛出异常。如果会抛出异常,上面的代码就会出问题。因此还是建议用 C++ 语言特性保证的方式来做lock / unlock。
【注意】
上面的 CAutoLocker 类中,成员变量 m_mutex 必须是 pthread_mutex_t 的引用,这样才能确保每次调用 CAutoLocker locker(s_lock) 的时候,locker::m_mutex 都是同一份 mutex。如果去掉引用符“&”,则每次执行 CAutoLocker locker(s_lock) 的时候,m_mutex 实际上都是一个不同的 mutex,具体见《pthread_mutex_t
变量不建议做复制操作》。上面代码中的
void operator = (const CAutoLocker&); CAutoLocker(const CAutoLocker&);表达的也是类似的意思。既然 m_mutex 不能复制,那么将其宿主 CAutoLocker 类也做成不能复制的。这里的= 操作符被声明重载成了 private 的,复制构造函数也被声明成了 private 的(这二者可以只声明,不用实现的),从而从语法上避免了拷贝动作的发生,否则编译时就会报错的。
相关文章推荐
- POSIX---互斥锁(pthread_mutex)和条件变量(pthread_cond)的用法
- POSIX详解pthread_mutex_lock
- C++简单封装pthread
- POSIX pthread线程库的封装-主动对象
- pthread简单封装 线程退出
- pthread_mutex_t封装
- POSIX详解pthread_mutex_lock
- 关于C++中posix pthread线程函数在类中封装的问题
- POSIX详解(二):pthread_mutex_lock
- pthread_mutex_lock线程锁使用简单示例
- 【pthread系列-11】对Pthread线程进行简单的类封装
- Mutex的简单封装
- posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
- 线程锁、进程锁、线程条件量、进程条件量、自动锁——pthread_mutex封装
- POSIX详解pthread_mutex_lock
- 关于C++中posix pthread线程函数在类中封装的问题
- Linux学习之互斥量的封装一:封装创建(pthread_mutex_init)和销毁(pthread_mutex_destroy)
- pthread_mutex_t封装
- pthread_mutex_t封装的读优先锁
- pthread_mutex_t封装