2019独角兽企业重金招聘Python工程师标准>>>

本文对Linux中的pthread_mutex_t做一个简易的封装。

互斥锁主要用于互斥,互斥是一种竞争关系,主要是某一个系统资源或一段代码,一次做多被一个线程访问。

条件变量主要用于同步,用于协调线程之间的关系,是一种合作关系

Linux中互斥锁的用法很简单,最常用的是以下的几个函数:

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);

我们利用RAII技术,将mutex的初始化和销毁放在构造函数和析构函数中

这里注意,pthread系列的函数都是成功时返回0,我采用一个轻量级的检查手段,来判断处理错误。

//用于pthread系列函数的返回值检查
#define TINY_CHECK(exp) \if(!(exp)) \{   \fprintf(stderr, "File:%s, Line:%d Exp:[" #exp "] is true, abort.\n", __FILE__, __LINE__); abort();\}

代码如下:

#ifndef MUTEXLOCK_H
#define MUTEXLOCK_H#include "NonCopyable.h"
//#include <boost/noncopyable.hpp>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>//用于pthread系列函数的返回值检查
#define TINY_CHECK(exp) \if(!(exp)) \{   \fprintf(stderr, "File:%s, Line:%d Exp:[" #exp "] is true, abort.\n", __FILE__, __LINE__); abort();\}class MutexLock : NonCopyable
{friend class Condition;
public:MutexLock();~MutexLock();void lock();void unlock();bool isLocking() const { return isLocking_; }pthread_mutex_t *getMutexPtr() //思考为什么不是const{ return &mutex_; } private:void restoreMutexStatus() //提供给Condition的wait使用{ isLocking_ = true; }pthread_mutex_t mutex_;bool isLocking_; //是否上锁
};class MutexLockGuard : NonCopyable
{
public:MutexLockGuard(MutexLock &mutex) :mutex_(mutex){ mutex_.lock(); }~MutexLockGuard(){ mutex_.unlock(); }
private:MutexLock &mutex_;
};#endif //MUTEXLOCK_H

cpp文件:

#include "MutexLock.h"
#include <assert.h>MutexLock::MutexLock():isLocking_(false)
{TINY_CHECK(!pthread_mutex_init(&mutex_, NULL));
}MutexLock::~MutexLock()
{assert(!isLocking());//确保解锁TINY_CHECK(!pthread_mutex_destroy(&mutex_));
}void MutexLock::lock()
{TINY_CHECK(!pthread_mutex_lock(&mutex_));isLocking_ = true;
}void MutexLock::unlock()
{isLocking_ = false;TINY_CHECK(!pthread_mutex_unlock(&mutex_));
}

后面我们可以继续使用RAII,将lock和unlock封装在同一个类中。

转载于:https://my.oschina.net/inevermore/blog/388702

Linux组件封装(一)中互斥锁MutexLock的封装相关推荐

  1. 用C++ 封装linux下的互斥锁MutexLock和条件变量Condition

    /*封装互斥锁的时候,要用到的方法,20200605*/ //问题一:MutexLock和Condition是否要设计成单例模式? // 单例模式只能通过该类创建出一个对象,这意味着只能创建一把锁,如 ...

  2. 【Linux C 多线程编程】互斥锁与条件变量

    一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1) 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态 ...

  3. linux线程间同步(1)互斥锁与条件变量

    线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量以及读写锁. 互斥锁(mutex) 互斥锁,是一种信 ...

  4. mysql 互斥_Mysql 中互斥锁的使用

    本文介绍如在在多线程mysql代码开发中使用互斥锁. mysql自己对c++的mutex又进行了一次封装,封装的代码可以在include/mysql/psi/mysql_thread.h  中找到. ...

  5. Linux多线程开发-线程同步-互斥锁pthread_mutex_t

    1.互斥锁 同一时刻只允许一个线程对临界区进行访问.POSIX库中用类型pthread_mutex_t来定义互斥锁,类型在pthreadtypes.h中定义. 2.如何声明一个互斥锁 #include ...

  6. linux 只运行一个实例 互斥锁,Linux多线程4-1_互斥量

    //包含头文件 int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *r ...

  7. 【Linux 多线程】自旋锁与互斥锁区别

    POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API.线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用 Pthreads提供的锁机制(lock)来对多 ...

  8. Linux下多线程编程互斥锁和条件变量的简单使用

    Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...

  9. linux互斥锁和PV原语

    刚接触linux互斥锁的时候可能会比较抽象,所以本文想要用PV原语来更加具体的理解linux互斥锁.如若有误,烦请指出,不甚感激! 由于线程共享了进程的资源和地址空间,因此,任何线程对系统资源的操作都 ...

  10. 自旋锁/互斥锁/读写锁/递归锁的区别与联系

    自旋锁 互斥锁 读写锁 递归锁 互斥锁(mutexlock): 最常使用于线程同步的锁:标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁:临界区和互斥量都可用来实现此锁 ...

最新文章

  1. 和我一起打造个简单搜索之SpringDataElasticSearch入门
  2. [ 一起学React系列 -- 6 ] 秘术之时间旅行-1
  3. Linux下执行.sh命令出现-bash: ./bin/start.sh: /bin/bash^M: bad interpreter: No such file or directory...
  4. jaxb和dozer简介
  5. 为什么我的对象被 IntelliJ IDEA 悄悄修改了?
  6. java用户输入_如何用Java获取用户输入?
  7. c语言的一些字符串库函数的自己实现
  8. BrnShop开源网上商城第三讲:插件的工作机制
  9. 初级程序员如何写项目周报和月报
  10. Linux内存从0到1学习笔记(7.3,用户空间虚拟内存之内存映射)
  11. 加载脚本依赖发生错误--暴力猴
  12. Java日期工具-Joda-Time和FastDateFormat
  13. Matlab许可证过期解决办法
  14. 网易即时通讯云平台99.99%可靠性的运维经验谈
  15. 微信怎么转移聊天记录到另一台新手机,3个免费方法!
  16. form表单AJAX提交
  17. 民营医院不做竞价,做啥能带业绩
  18. 局部路径规划器teb_local_planner详解3:跟随全局planner
  19. P3084 照片 [差分约束]
  20. iframe的使用和替代iframe的标签

热门文章

  1. 通用的分页存储过程(少量代码实现)
  2. Codeforces Beta Round #61 (Div. 2)
  3. 【转】正则表达式括号的作用
  4. Mac端SVN工具CornerStone详解
  5. 模拟百度搜索框,输入时显示历史记录
  6. MyEclipse10.6 安装SVN插件方法及插件下载地址
  7. [51nod1206]Picture
  8. Fedora23 安装 psycopg2
  9. 最新wp建站做淘宝客系统教程(共6课)附源码
  10. Oracle 数据库导出(exp)导入(imp)说明