阅读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.继承、友元类、抽象类等的实践。
相关文章推荐
- 【Linux开发技术之工具使用】配置VIM下编程和代码阅读环境
- iOS多线程编程之NSThread的使用 分类: ios开发 2015-01-01 12:36 123人阅读 评论(0) 收藏
- 【Linux开发技术之工具使用】配置VIM下编程和代码阅读环境 - gnuhpc - 博客园
- linux开发多线程中lsof与ulimit的使用的2个链接
- 【Linux开发技术之工具使用】配置VIM下编程和代码阅读环境
- Linux多线程开发(三):使用C++封装线程消息通信
- Linux 开发,使用多线程还是用 IO 复用 select/epoll?
- (转)【Linux开发技术之工具使用】配置VIM下编程和代码阅读环境
- 【Linux开发技术之工具使用】配置VIM下编程和代码阅读环境
- linux下的多线程调试(gdb) 分类: 嵌入式开发学习 2011-07-21 22:37 3337人阅读 评论(0) 收藏
- 如何使用Java编写多线程程序-Java基础-Java-编程开发
- Linux下源代码阅读工具lxr安装使用说明
- Linux手机开发中,尽量不要用多线程。
- linux 多线程和同步机制的使用
- Linux下源代码阅读工具lxr安装使用说明
- 使用 Java 进行 MySQL 开发 (摘自:MySQL for Linux on POWER,第 2 部分: 开发应用)
- 使用Qt, KDevelop Designer开发Linux的图形界面
- Maemo Linux手机平台系列分析:8 Maemo平台开发之 使用Glib绑定的D-Bus
- linux下使用ICE开发
- linux应用程序开发(第2版),创建和使用库章节中共享库的测试(摘录)