Linux组件封装(一)中互斥锁MutexLock的封装
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的封装相关推荐
- 用C++ 封装linux下的互斥锁MutexLock和条件变量Condition
/*封装互斥锁的时候,要用到的方法,20200605*/ //问题一:MutexLock和Condition是否要设计成单例模式? // 单例模式只能通过该类创建出一个对象,这意味着只能创建一把锁,如 ...
- 【Linux C 多线程编程】互斥锁与条件变量
一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1) 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态 ...
- linux线程间同步(1)互斥锁与条件变量
线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量以及读写锁. 互斥锁(mutex) 互斥锁,是一种信 ...
- mysql 互斥_Mysql 中互斥锁的使用
本文介绍如在在多线程mysql代码开发中使用互斥锁. mysql自己对c++的mutex又进行了一次封装,封装的代码可以在include/mysql/psi/mysql_thread.h 中找到. ...
- Linux多线程开发-线程同步-互斥锁pthread_mutex_t
1.互斥锁 同一时刻只允许一个线程对临界区进行访问.POSIX库中用类型pthread_mutex_t来定义互斥锁,类型在pthreadtypes.h中定义. 2.如何声明一个互斥锁 #include ...
- linux 只运行一个实例 互斥锁,Linux多线程4-1_互斥量
//包含头文件 int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *r ...
- 【Linux 多线程】自旋锁与互斥锁区别
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API.线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用 Pthreads提供的锁机制(lock)来对多 ...
- Linux下多线程编程互斥锁和条件变量的简单使用
Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...
- linux互斥锁和PV原语
刚接触linux互斥锁的时候可能会比较抽象,所以本文想要用PV原语来更加具体的理解linux互斥锁.如若有误,烦请指出,不甚感激! 由于线程共享了进程的资源和地址空间,因此,任何线程对系统资源的操作都 ...
- 自旋锁/互斥锁/读写锁/递归锁的区别与联系
自旋锁 互斥锁 读写锁 递归锁 互斥锁(mutexlock): 最常使用于线程同步的锁:标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁:临界区和互斥量都可用来实现此锁 ...
最新文章
- 和我一起打造个简单搜索之SpringDataElasticSearch入门
- [ 一起学React系列 -- 6 ] 秘术之时间旅行-1
- Linux下执行.sh命令出现-bash: ./bin/start.sh: /bin/bash^M: bad interpreter: No such file or directory...
- jaxb和dozer简介
- 为什么我的对象被 IntelliJ IDEA 悄悄修改了?
- java用户输入_如何用Java获取用户输入?
- c语言的一些字符串库函数的自己实现
- BrnShop开源网上商城第三讲:插件的工作机制
- 初级程序员如何写项目周报和月报
- Linux内存从0到1学习笔记(7.3,用户空间虚拟内存之内存映射)
- 加载脚本依赖发生错误--暴力猴
- Java日期工具-Joda-Time和FastDateFormat
- Matlab许可证过期解决办法
- 网易即时通讯云平台99.99%可靠性的运维经验谈
- 微信怎么转移聊天记录到另一台新手机,3个免费方法!
- form表单AJAX提交
- 民营医院不做竞价,做啥能带业绩
- 局部路径规划器teb_local_planner详解3:跟随全局planner
- P3084 照片 [差分约束]
- iframe的使用和替代iframe的标签