基础能力-加解锁

简介: 关于加解锁的两种实现方式方案一:使用C++11 atomic_flag原子特性实现细粒度加解锁#ifndef YAGER_MUTEX_H#define YAGER_MUTEX_H#include class CYagerMute...

关于加解锁的两种实现方式

方案一:使用C++11 atomic_flag原子特性实现细粒度加解锁
#ifndef YAGER_MUTEX_H
#define YAGER_MUTEX_H

#include <atomic>

class CYagerMutex
{
public:
    CYagerMutex()
        : m_atomicFlag(ATOMIC_FLAG_INIT)
    {}

    ~CYagerMutex()
    {}

    void Lock()
    {
        while (m_atomicFlag.test_and_set());
    }

    void UnLock()
    {
        m_atomicFlag.clear();
    }

private:
    std::atomic_flag  m_atomicFlag;

};
#endif //YAGER_MUTEX_H
方案二:使用libuv的mutex,实现粗粒度的加解锁
#include "libuv/include/uv.h"

class CYagerMutex
{
public:
    CYagerMutex()
    {
        uv_mutex_init(&m_mutex);
    }

    ~CYagerMutex()
    {
        uv_mutex_destroy(&m_mutex);
    }

    void Lock()
    {
        uv_mutex_lock(&m_mutex);
    }

    void UnLock()
    {
        uv_mutex_unlock(&m_mutex);
    }

private:
    uv_mutex_t	m_mutex;

};

关于加解锁的两种实现方式

方案一:使用C++11 atomic_flag原子特性实现细粒度加解锁
#ifndef YAGER_MUTEX_H
#define YAGER_MUTEX_H

#include <atomic>

class CYagerMutex
{
public:
    CYagerMutex()
        : m_atomicFlag(ATOMIC_FLAG_INIT)
    {}

    ~CYagerMutex()
    {}

    void Lock()
    {
        while (m_atomicFlag.test_and_set());
    }

    void UnLock()
    {
        m_atomicFlag.clear();
    }

private:
    std::atomic_flag  m_atomicFlag;

};
#endif //YAGER_MUTEX_H
方案二:使用libuv的mutex,实现粗粒度的加解锁
#include "libuv/include/uv.h"

class CYagerMutex
{
public:
    CYagerMutex()
    {
        uv_mutex_init(&m_mutex);
    }

    ~CYagerMutex()
    {
        uv_mutex_destroy(&m_mutex);
    }

    void Lock()
    {
        uv_mutex_lock(&m_mutex);
    }

    void UnLock()
    {
        uv_mutex_unlock(&m_mutex);
    }

private:
    uv_mutex_t	m_mutex;

};
目录
相关文章
|
SQL 弹性计算 关系型数据库
转 PostgreSQL 认证考试(商业版本EDB enterpriseDB认证考试) 指南
标签 PostgreSQL , 认证 , edb 背景 转一篇华军写的认证指南。想考PG认证的小伙伴可以参考。 原文 https://yq.aliyun.com/articles/464038 1. 背景 因为工作的原因,需要考一个PostreSQL技术认证。经过一些准备,终于在今年的3月和5月参加并通过了EnterpriseDB的Associate和Professional认证
3604 0
转 PostgreSQL 认证考试(商业版本EDB enterpriseDB认证考试) 指南
|
人工智能 Java 对象存储
Java获取阿里云图片临时URL与图片文件转换Base64编码方法
在使用阿里云人工智能产品服务时,有部分服务需要上传的参数中包含文件URL,当我们没有开通OSS服务时,可以使用临时URL服务、或部分服务支持Base64编码格式,此文章为生成临时URL-JavaSDK方案与图片文件转换Base64编码方案。
2363 0
|
5月前
|
人工智能 数据可视化
关于AI编程对普通人的一个最大的缺点
AI虽擅长编码,但图形界面设计能力较弱,普通人难以通过命令行操作。建议集成可视化UI设计工具,如拖拽组件、精准设尺寸,让AI生成代码,减少反复调试,提升效率。
|
编译器 API 语音技术
SDK介绍
【10月更文挑战第21天】
|
10月前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
337 27
|
JavaScript Ruby
淘宝 NPM 镜像
我们以前介绍过cnpmjs.org,非常棒的npm国内镜像。由于其使用量越来越大,加上淘宝内部也有很多项目使用 NodeJS,于是,淘宝正式基于 cnpmjs 推出了镜像服务。
10617 1
淘宝 NPM 镜像
|
人工智能 监控 搜索推荐
数字孪生与娱乐业:沉浸式体验的提升
数字孪生技术通过创建物理实体的虚拟副本,为娱乐业带来创作自由与沉浸体验的双重提升。本文探讨了该技术在虚拟演唱会、电影游戏制作、主题公园及音乐教育中的应用,以及提升沉浸体验的关键要素,展望了其面临的挑战与未来前景。
|
存储 图形学
【unity小技巧】unity事件系统创建通用的对象交互的功能
【unity小技巧】unity事件系统创建通用的对象交互的功能
407 0
|
机器学习/深度学习 数据采集 算法
02 放大招,Python预测8月22号双色球号码!
02 放大招,Python预测8月22号双色球号码!
|
机器学习/深度学习 算法 Linux
图像处理 手写体英文字母的目标检测与识别 实验报告
图像处理 手写体英文字母的目标检测与识别 实验报告
948 0
图像处理 手写体英文字母的目标检测与识别 实验报告