基础能力-加解锁

简介: 关于加解锁的两种实现方式方案一:使用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认证
3588 0
转 PostgreSQL 认证考试(商业版本EDB enterpriseDB认证考试) 指南
|
编译器 API 语音技术
SDK介绍
【10月更文挑战第21天】
|
4月前
|
Web App开发 Ubuntu Linux
Linux之Ubuntu操作系统安装
1、在Ubuntu系统下,可以使用自带的U盘启动制作软件制作启动盘。使用方法和rufus类似。 2、或者用dd命令制作启动盘,关于dd命令的使用方法可以百度查看。经过亲自实践,archlinux系统和红旗9.0系统的启动U盘就是用dd命令制作成功。
|
9月前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
321 27
|
存储 图形学
【unity小技巧】unity事件系统创建通用的对象交互的功能
【unity小技巧】unity事件系统创建通用的对象交互的功能
368 0
|
负载均衡 算法 网络虚拟化
生成树原理详解
生成树原理详解
396 0
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习在游戏开发中的创新应用
【8月更文挑战第11天】深度学习技术在游戏开发中的应用为游戏产业带来了前所未有的变革和机遇。通过不断探索和创新应用,我们有理由相信未来的游戏将会更加智能、丰富和引人入胜。
|
编解码 人工智能
DiT架构大一统:一个框架集成图像、视频、音频和3D生成,可编辑、能试玩
【5月更文挑战第23天】研究人员提出Lumina-T2X框架,统一生成和编辑图像、视频、音频及3D内容。使用Flow-based Large Diffusion Transformer (Flag-DiT)模型,实现多模态生成,支持内容编辑。尽管面临训练资源需求高、生成质量不及人类创作等问题,该框架在娱乐、广告等领域有广泛应用潜力。[论文链接](https://arxiv.org/pdf/2405.05945)
493 1
|
缓存 数据安全/隐私保护 C++
两道挺有意思的 CTF 题
两道挺有意思的 CTF 题
|
存储 运维 分布式计算
大数据 SRE 体系能力建设(一)| 学习笔记
快速学习大数据 SRE 体系能力建设。
大数据 SRE 体系能力建设(一)| 学习笔记