C++标准库多线程同步机制互斥量总结

简单的多线程同步机制,互斥量使用实例:

//文件:main.cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
#include "CSingleton.h"

using namespace std;
/*
1.defer_lock_t 表示不要求拥有mutex的所有权
2.try_to_lock_t 以非阻塞的方式去尝试获取mutex的所有权
3.adopt_lock_t 假定调用线程已经获取到了mutex的所有权
*/

mutex g_mutex;                      //互斥锁
timed_mutex g_tMutex;               //时间锁,限制最大阻塞时间
recursive_mutex g_rMutex;           //线程内可重复锁
recursive_timed_mutex g_rTMutex;    //线程内可重复时间锁
condition_variable g_cond1;         //条件变量

void ReadData(){};
void WriteData(){};

int main()
{
    //mutex
    {
        g_mutex.lock();
        cout << "g_mutex.lock()" << endl;
        g_mutex.unlock();

        if (g_mutex.try_lock())
        {
            cout << "g_mutex.try_lock()" << endl;
            g_mutex.unlock();
        }
    }
    //time mutex
    {
        std::lock_guard<std::timed_mutex> lock(g_tMutex);       //g_tMutex.lock();
        auto now = std::chrono::steady_clock::now();
        bool result = g_tMutex.try_lock_until(now + std::chrono::seconds(5));
        cout << "g_tMutex.try_lock_until() 5 seconds" << endl;
        //g_tMutex.unlock();
    }
    //recursive mutex
    {
        g_rMutex.lock(); 
        if (g_rMutex.try_lock()) {                          //to lock it again
            std::cout << "lock acquired" << std::endl;
            g_rMutex.unlock();
        }
        else {
            std::cout << "lock not acquired" << std::endl;
        }
        g_rMutex.unlock();
    }

    {
        //shared_lock<mutex> lock(g_mutex);//共享锁,可以用做读锁,可以多线程同时读取数据,C++17支持的接口
        ReadData();
        lock_guard<mutex> lock(g_mutex); //自动上锁解锁,不能传值
        WriteData();
        cout << "lock_guard<mutex> lock(g_mutex)" << endl;
    }

    {
        unique_lock<mutex> lock(g_mutex);//自动上锁解锁,可以传值
        cout << "unique_lock<mutex> lock(g_mutex)" << endl;
    }

    {
        lock(g_mutex, g_rMutex); //使用多个锁的时候,使用lock()避免死锁
        
    }

    //call_once()和once_flag实现单例
    {
        CSingleton *instance = CSingleton::GetInstance();
    }
    return 0;
}

单例的call_once()实现:

//文件: CSingleton.h

#include <thread>
#include <mutex>
#include <condition_variable>

class CSingleton
{
private:
    CSingleton();
    static void Init()
    {
        if (m_instanse == nullptr)
            m_instanse = new CSingleton();
    };

public:
    ~CSingleton();

    static CSingleton * GetInstance()
    {
        std::call_once(m_initOnceFlag, Init);
        return m_instanse;
    };

private:
    static CSingleton *m_instanse;
    static std::once_flag m_initOnceFlag;
}; 
CSingleton* CSingleton::m_instanse = nullptr;

这个单例实现不知道有没有更好的方式,如有欢迎评论提出。

学习链接:https://blog.csdn.net/lgyxdn/article/details/100537540

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值