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 ...
随机推荐
- Python File writelines() 方法
概述 writelines() 方法用于向文件中写入一序列的字符串.高佣联盟 www.cgewang.com 这一序列字符串可以是由迭代对象产生的,如一个字符串列表. 换行需要制定换行符 \n. 语法 ...
- PHP srand() 函数
实例 播种随机数生成器: <?phpsrand(mktime());echo(rand());?>高佣联盟 www.cgewang.com 定义和用法 srand() 函数播种随机数生成器 ...
- [转]HashMap 和 currentHashMap 总结
作者:浅蓝色的麻吉 https://www.jianshu.com/p/a7767e6ff2a2 1. 什么是哈希表 在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能 1. ...
- ios企业签名为什么会掉签?
我们都知道ios用户无法直接安装App Store之外的应用,对于那些无法上架苹果应用商店的APP,开发者们一般会选择苹果签名的形式. 目前的苹果签名有ios企业签名.超级签名和TF上架这三种 ...
- Android ViewPager进行碎片(Fragment)的分页操作
今天讲的是ViewPager 这个东西就是 假设你写了Fragment和Fragment1两个界面,用这个控件就可以实现两个界面之间的滑动,而不用Intent去跳转: 注意: 在布局中定义控件的时候, ...
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)
前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 打算用三个篇幅来记录完整的全过程 觉得有帮助的朋友~可以左上 ...
- Java基础—控制流程语句(条件语句与循环结构)
与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流程.Java的控制流程结构与C和C++的控制流程机构一样,只有很少的例外情况.没有goto语句,但break语句可以带标签,可以利用它实 ...
- SCHP代码中的问题
1.subprocess.CalledProcessError: Command ‘[‘where’, ‘cl’]’ returned non-zero exit status 1. 这个问题是因为电 ...
- java流程控制语句if
一 if语句 if语句是指如果满足某种条件,就进行某种处理. 格式: if (条件语句){ 执行语句; …… } 流程图: 例如: public class IfDemo01 { public sta ...
- java 网络通信协议、UDP与TCP
一 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定 的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通 ...