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相关类的更多相关文章

  1. SpringBoot源码学习1——SpringBoot自动装配源码解析+Spring如何处理配置类的

    系列文章目录和关于我 一丶什么是SpringBoot自动装配 SpringBoot通过SPI的机制,在我们程序员引入一些starter之后,扫描外部引用 jar 包中的META-INF/spring. ...

  2. 43.Permission源码解析和自定义权限类

    drf的权限类位于permission模块   如何确定权限 认证.限流,权限决定是否应该接收请求或拒绝访问 权限检查在视图的最开始处执行,在继续执行其他代码前 权限检查通常会使用request.us ...

  3. 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类

    21_BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类 BasicTaskScheduler基本任务调度器 BasicTaskScheduler基 ...

  4. Mybatis源码解析(三) —— Mapper代理类的生成

    Mybatis源码解析(三) -- Mapper代理类的生成   在本系列第一篇文章已经讲述过在Mybatis-Spring项目中,是通过 MapperFactoryBean 的 getObject( ...

  5. muduo源码解析11-logger类

    logger: class logger { }; 在说这个logger类之前,先看1个关键的内部类 Impl private: //logger内部数据实现类Impl,内部含有以下成员变量 //时间 ...

  6. muduo源码解析10-logstream类

    FixedBuffer和logstream class FixedBuffer:noncopyable { }: class logstream:noncopyable { }: 先说一下包含的头文件 ...

  7. 20 BasicTaskScheduler0 基本任务调度类基类(二)——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

  8. 19 BasicTaskScheduler0 基本任务调度类基类(一)——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

  9. 18 TaskScheduler任务调度器抽象基类——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

随机推荐

  1. 【JMicro】微服务部署example.provider应用

    JMicro是一个用Java语言实现的开源微服务全家桶, 源码地址:https://github.com/mynewworldyyl/jmicro, Demo地址:http://124.70.152. ...

  2. MacOS 键盘符号和修饰键说明

    原文链接:https://www.cnblogs.com/exmyth/p/5949192.html   Mac键盘符号和修饰键说明 ⌘ Command ⇧ Shift ⌥ Option ⌃ Cont ...

  3. Python continue语句

    Python continue语句: 当执行到 continue 语句时,将不再执行本次循环中 continue 语句接下来的部分,而是继续下一次循环. lst = [7,8,9,4,5,6] for ...

  4. PHP gmstrftime() 函数

    ------------恢复内容开始------------ 实例 根据区域设置格式化 GMT/UTC 日期和时间: <?phpecho(gmstrftime("%B %d %Y, % ...

  5. PHP ftruncate() 函数

    定义和用法 ftruncate() 函数把打开文件截断到指定的长度. 如果成功则返回 TRUE,如果失败则返回 FALSE. 语法 ftruncate(file,size) 参数 描述 file 必需 ...

  6. PHP symlink() 函数

    定义和用法 symlink() 函数创建一个从指定名称连接的现存目标文件开始的符号连接. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 symlink(target,link) ...

  7. AutoWired注解和Lazy延迟加载

    一.代码截图: @Lazy是延迟加载的意思, 容器启动时不创建对象, 当从容器中需要获取此对象时才创建. @Lazy//@Lazy注解可以用在类上, 还可以用在普通方法上,还可以用在构造方法上,还可以 ...

  8. 账本APP服务器端开发

    账本APP开发 好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 上一篇文章我们聊 ...

  9. Redis服务之高可用组件sentinel

    前文我们了解了redis的常用数据类型相关命令的使用和说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13419690.html:今天我们来聊一下redis ...

  10. CAS(乐观锁)以及ABA问题

    https://blog.csdn.net/wwd0501/article/details/88663621独占锁是一种悲观锁,synchronized就是一种独占锁:它假设最坏的情况,并且只有在确保 ...