muduo源码解析5-mutex相关类
mutexlock和mutexlockguard
class mutexlock:noncopyable
{
}; class mutexlockguard:noncopyable
{
};
作用:
本文仅实现了最基本的mutexlock和mutexlockguard,放弃了muduo源码中的一大堆宏定义,为求精简可读性高。
成员变量mutexlock:
private:
pthread_mutex_t m_mutex;
pid_t m_holder;
m_mutex为要操作的mutex。主要有init,destroy,lock,unlock操作。
m_holder代表当前该m_mutex被哪一个线程所持有,m_holder>0表示持有该锁的线程ID,否则表示该锁可用。
成员函数mutexlock:
public:
mutexlock():m_holder()
{
pthread_mutex_init(&m_mutex,NULL);
}
~mutexlock()
{
assert(m_holder==);
pthread_mutex_destroy(&m_mutex);
}
//该锁是否被当前线程所持有
bool isLockedByThisThread() const
{
return m_holder==currentthread::tid();
} void assertLocked() const
{
assert(isLockedByThisThread());
}
//加锁后设置m_holder为当前线程ID
void lock()
{
pthread_mutex_lock(&m_mutex);
assignHolder();
}
//解锁前先让当前m_holder设置为0
void unlock()
{
unassignHolder();
pthread_mutex_unlock(&m_mutex); }
pthread_mutex_t* getPthreadMutex()
{
return &m_mutex;
} private:
friend class Condition;
//一个易于分配m_holder的内部类,仅含有一个mutexlock成员用于分配与释放
class UnassignGuard:noncopyable
{
public:
explicit UnassignGuard(mutexlock& owner):m_owner(owner)
{
m_owner.unassignHolder();
}
~UnassignGuard()
{
m_owner.assignHolder();
}
private:
mutexlock& m_owner;
};
//设置m_holder为当前线程ID
void assignHolder()
{
m_holder=currentthread::tid();
}
//清零m_holder
void unassignHolder()
{
m_holder=;
}
mutexlock重要就是四个操作,mutex的init,destroy,lock,unlock
有两个数据成员pthread_mutex_t和m_holder
mutex就是上述四个操作,m_holder表示此mutex被哪一个线程ID所拥有,为0表示没被拥有
lock时m_holder为持有此锁的线程ID,unlock时m_holder为0
还可以判断当前mutex是否被当前线程给锁住,isLockedByThisThread()
成员变量mutexlockguard:
private:
mutexlock& m_mutex;
内部仅有一个mutexlock变量用于简化操作
成员函数mutexlockguard:
public:
explicit mutexlockguard(mutexlock& mutex):m_mutex(mutex)
{
m_mutex.lock();
}
~mutexlockguard()
{
m_mutex.unlock();
}
仅提供构造与析构函数,为了简化对于mutexlock的操作,利用mutexlock引用传参构造,在构造时获得锁,在析构时释放锁。
测试:
//注意mymuduo::currentthread::cacheTid还没写实现,而且currentthread::Tid()也没有实现,在这里仅是测试mutex相关的功能。
#include"base/mutex.h"
#include<thread>
#include <stdio.h> #include<iostream> mymuduo::mutexlock mutex; namespace mymuduo{
namespace currentthread { void cacheTid()
{
}
}
} long count=;
void workerthread1()
{
for(int i=;i<;i++)
{
mymuduo::mutexlockguard mlg(mutex);
count++;
}
} int main()
{
std::thread t[];
for(int i=;i<;i++)
t[i]=std::thread(workerthread1); for(int i=;i<;i++)
t[i].join(); std::cout<<count<<std::endl; }
muduo源码解析5-mutex相关类的更多相关文章
- SpringBoot源码学习1——SpringBoot自动装配源码解析+Spring如何处理配置类的
系列文章目录和关于我 一丶什么是SpringBoot自动装配 SpringBoot通过SPI的机制,在我们程序员引入一些starter之后,扫描外部引用 jar 包中的META-INF/spring. ...
- 43.Permission源码解析和自定义权限类
drf的权限类位于permission模块 如何确定权限 认证.限流,权限决定是否应该接收请求或拒绝访问 权限检查在视图的最开始处执行,在继续执行其他代码前 权限检查通常会使用request.us ...
- 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类
21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类 BasicTaskScheduler基本任务调度器 BasicTaskScheduler基 ...
- Mybatis源码解析(三) —— Mapper代理类的生成
Mybatis源码解析(三) -- Mapper代理类的生成 在本系列第一篇文章已经讲述过在Mybatis-Spring项目中,是通过 MapperFactoryBean 的 getObject( ...
- muduo源码解析11-logger类
logger: class logger { }; 在说这个logger类之前,先看1个关键的内部类 Impl private: //logger内部数据实现类Impl,内部含有以下成员变量 //时间 ...
- muduo源码解析10-logstream类
FixedBuffer和logstream class FixedBuffer:noncopyable { }: class logstream:noncopyable { }: 先说一下包含的头文件 ...
- 20 BasicTaskScheduler0 基本任务调度类基类(二)——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- 19 BasicTaskScheduler0 基本任务调度类基类(一)——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
- 18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类
这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...
随机推荐
- matplotlib基础汇总_02
设置plot的风格和样式 点和线的样式 颜色 参数color或c 五种定义颜色值的方式 别名 color='r' 合法的HTML颜色名 color = 'red' HTML十六进制字符串 color ...
- PHP image_type_to_extension - 获取图片后缀
image_type_to_extension — 根据指定的图像类型返回对应的后缀名.高佣联盟 www.cgewang.com 语法 string image_type_to_extension ( ...
- python 操作元组 列表===python中三大宝刀(字典已经再上一遍 说过)
字典俗称,世界有多大就能装多大 列表俗称,你们决定 元组俗称,可远观而不可亵玩焉 列表的相关操作a=['1','2','3','5','6','7']# print(a[0])# print(a[0: ...
- Java 添加、删除、格式化Word中的图片
本文介绍使用Spire.Cloud.SDK for Java提供的ImagesApi接口来操作Word中的图片.具体可通过addImage()方法添加图片.deleteImage()方法删除图片.up ...
- K短路 学习笔记
K短路,顾名思义,是让你求从$s$到$t$的第$k$短的路. 暴力当然不可取,那么我们有什么算法可以解决这个问题? -------------------------- 首先,我们要维护一个堆. st ...
- 移动物体监控系统-sprint4嵌入式web服务器开发
一.BOA嵌入式服务器的移植 step1:下载BOA服务器并解压,进入boa下面的src目录,执行./configure生成必须的配置文件以及Makefile step2:修改Makefile文件 c ...
- 打开IDEA后tomcat不能用,Cannot load project of unknown project type,无法加载类或者项目
这一问题在网络中有比较统一的解决方法,我这个也是按这个方法解决的. 问题出现的前提和原因: 一个运行正常项目,我关闭后第二天打开发现tomcat不能用了. 解决方法: 我查了一下,这是一个IDEA软件 ...
- 2020年最新的过某宝滑块验证技术,Python大牛轻松搞定技术难题
致谢: Charles未晞 Charles的皮卡丘 提供解决思路,此文实为借鉴. 前言: 利用selenium模拟登录淘宝,外界传言这个确实很难过,有各种轨迹检测. 但是我没想到淘宝的滑块验证码这么容 ...
- MinIO很强-让我放弃FastDFS拥抱MinIO的8个理由
目前可用于文件存储的网络服务选择有很多,比如阿里云OSS.七牛云.腾讯云等等,但是收费都有点小贵.为了帮公司节约成本,之前一直是使用fastDFS作为文件服务器,准确的说是图片服务器.直到我发现了Mi ...
- HTML 命名规范!
HTML基础设施 (1)文件应以<!DOCTYPE.....>首行顶格开始,这句话告诉浏览器这是一个什么文件,我们推荐使用<!DOCTYPE html>. (2)必须在head ...