在《Unix下的线程互斥量》一文中我们使用Thread_Mutex来保护线程共享资源,但如果互斥体上锁之后没有解锁就会发生死锁。这是一个很普遍的错误,我们采用Scope Lock模式,我们构造对象Scope_Mutex,其中构造函数对互斥体加锁,析构函数对互斥体解锁。C++保证了析构函数一定会被调用,所以即使是有异常抛出,互斥体也总是会被正确的解锁。下面给出Scope_Mutex的具体实现:

class Scope_Mutex

{

private:

Thread_Mutex mMutex;

Scope_Mutex(const Scope_Mutex&);

Scope_Mutex& operator=(const Scope_Mutex&);

public:

// 构造时对互斥量进行加锁

explicit Scope_Mutex(Thread_Mutex &m) : mMutex(m)

{

mMutex.lock();

}

// 析构时对互斥量进行解锁

~Scope_Mutex()

{

mMutex.unlock();

}

};

class Thread_Mutex {

public:

/*

* 构造函数

*/

Thread_Mutex() {

assert(pthread_mutex_init(&_mutex, NULL) == 0);

}

/*

* 析造函数

*/

~Thread_Mutex() {

//销毁互斥量

pthread_mutex_destroy(&_mutex);

}

/*

* 加锁

*/

void lock ()

{

int error;

//锁住互斥量

error = pthread_mutex_lock(&_mutex);

if (error != 0)

{

errno = error;

perror("Mutex lock");

abort();

}

}

/*

* 解锁

*/

void unlock()

{

int error;

//解锁互斥量

error = pthread_mutex_unlock(&_mutex);

if (error != 0)

{

errno = error;

perror("Mutex unlock");

abort();

}

}

protected:

pthread_mutex_t _mutex;

};

mysql lock scope_scope_lock模式详解相关推荐

  1. mysql索引 include_MySql索引详解

    什么是索引? 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 2.索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构 ...

  2. Android  Doze and App Standby模式详解

    Android  Doze and App Standby模式详解 来源:腾云阁 https://www.qcloud.com/community Optimizing for Doze and Ap ...

  3. mysql配置文件my.cnf详解

    mysql配置文件my.cnf详解 basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = path 给出存放着字符集的目录. datadir = ...

  4. 转:mysql show processlist命令 详解

    转:mysql show processlist命令 详解 processlist 命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令. 1.        进 ...

  5. MySQL UUID函数的详解

    文章来源:http://www.mysqlops.com/2011/03/01/mysql-uuid.html MySQL UUID函数的详解 MySQL中可以有二类用于生成唯一值性质的工具:UUID ...

  6. MySQL权限授权认证详解

    MySQL权限授权认证详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL权限系统介绍 1>.权限系统的作用是授予来自某个主机的某个用户可以查询.插入.修改.删 ...

  7. Navicat的mysql远程登录方法详解

    Navicat的mysql远程登录方法详解 工具和前提 远程连接方法 疑惑问题 报错汇总 关闭并删除用户 引用 工具和前提 1.均在Navicat上面进行操作: 2.Navicat15的版本,本地数据 ...

  8. MySQL操作mysqldump命令详解

    MySQL操作mysqldump命令详解 基本命令: # 数据库备份-->mysqldump命令默认做锁表操作 mysqldump -uroot -ppassword --all-databas ...

  9. Android M新特性Doze and App Standby模式详解

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/52312122 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

最新文章

  1. Mobile3DRecon:手机上的实时单眼3D重建
  2. POJ 1789 Truck History
  3. 腾讯实时音视频开发应用大赛火热开赛,两大主题、60万奖品,等你来拿!
  4. 信息表示和处理 from computer system chapter 2
  5. 谭浩强课后题之----水仙花数
  6. Android4开发入门经典 之 第七部分:数据存储
  7. qt自定义窗口添加父窗口后,显示不出来
  8. MSSQL-最佳实践-如何监控备份还原进度
  9. 与国际接轨,中国人慎用这些汉字取名(最后一段对话,笑到喷饭!!)
  10. 插槽的使用_思维导图
  11. (转)Hibernate快速入门
  12. python学习笔记 - 函数: 传参列表副本(不改变列表本身)
  13. 计算机等级考试四级--软件工程
  14. COFs单体—醛类单体/氨基单体/硼酸系列
  15. love2d教程10--粒子效果
  16. eclipse报错:The project was not built due to “Could not delete...”. Fix the problem...
  17. mtd-utils交叉编译
  18. Chrome与Chromedriver版本对应表(最新)【附下载链接】
  19. ESB 企业服务总线基本内容概述
  20. JWT(Golang)

热门文章

  1. Python之format格式化输出
  2. Python之collections容器数据类型
  3. Spring boot定制错误json数据
  4. Keepalived工作原理
  5. u盘魔术师装linux,使用U盘魔术师安装Win7系统教程
  6. macbookpro升级后打不开eclipse_维修分享——面容坏升级iOS13系统后 导致前后摄像头都打不开...
  7. Java程序员必备:序列化全方位解析
  8. 向上取整的方法_PHP取整方法小总结
  9. Struts2 文件下载
  10. java中类与对象回顾总结