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 ...
随机推荐
- PHP array_slice() 函数
实例 从数组的第二个元素开始取出,并返回直到数组末端的所有元素: <?php$a=array("red","green","blue" ...
- PHP array_pad() 函数
实例 返回 5 个元素,并将 "blue" 值插入到数组的新元素中: <?php$a=array("red","green");pri ...
- Python os.chflags() 方法
概述 os.chflags() 方法用于设置路径的标记为数字标记.多个标记可以使用 OR 来组合起来.高佣联盟 www.cgewang.com 只支持在 Unix 下使用. 语法 chflags()方 ...
- Python time altzone()方法
描述 Python time altzone() 函数返回格林威治西部的夏令时地区的偏移秒数.高佣联盟 www.cgewang.com 如果该地区在格林威治东部会返回负值(如西欧,包括英国).对夏令时 ...
- PHP cosh() 函数
实例 返回不同数的双曲余弦: <?phpecho(cosh(3) . "<br>");echo(cosh(-3) . "<br>" ...
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(二.创建CI持续集成管道)
前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 上一篇: Azure DevOps+Docker+Asp.N ...
- PHP基础之排序
前言 之前简单介绍了流程控制,函数,数组等.有兴趣的可以看看. PHP入门之类型与运算符 PHP入门之流程控制 PHP入门之函数 PHP入门之数组 接下来介绍一下排序,排序是将一组数据,依指定的顺序进 ...
- Java编译解释之cmd
一.编译 1. javac 类名.java (在类当前目录下) 2. javac 类的全路径 二.解释 1. java 类名(在类当前目录下) 2. java -cp 类的当前目录路径 类名
- JQuery的turn.js实现翻书效果
前言: hello大家好~好久没更博了……今天来和大家分享下JQ的turn.js,下面我先来简单介绍下我们今天的主角turn.js. Turn.js是一个JavaScript库,它集合了HTML5的所 ...
- 主成分分析PCA数据降维原理及python应用(葡萄酒案例分析)
目录 主成分分析(PCA)——以葡萄酒数据集分类为例 1.认识PCA (1)简介 (2)方法步骤 2.提取主成分 3.主成分方差可视化 4.特征变换 5.数据分类结果 6.完整代码 总结: 1.认识P ...