C/C++教程

c++读写锁和条件变量

本文主要是介绍c++读写锁和条件变量,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

读写锁

std::shared_mutex用于管理可转移和共享所有权的互斥对象,适用场景比较特殊:一个或多个读线程同时读取共享资源,且只有一个写线程来修改这个资源,这种情况下才能从shared_mutex获取性能优势(Shared mutexes are usually used in situations when multiple readers can access the same resource at the same time without causing data races, but only one writer can do so.)

std::unique_lock和std::lock_guard的选择问题,这个回答写的很好:
unique_lock比lock_guard要灵活
lock_guard锁定后不能释放,mutex是一直锁定的,而unique_lock可以释放。
unique_lock手动加锁解锁例子参考此处

std::mutex m_mutex;
void print(int cnt)
{
    //用unique_lock来对锁进行管理.defer_lock是它的构造参数之一.用来推迟加锁.
    unique_lock<mutex> lock(m_mutex, defer_lock);
    /*
        ...这里可以进行一系列线程安全的操作...
    */
    //手动加锁.
    lock.lock();
    cout << std::this_thread::get_id() << " " << cnt << endl;
    lock.unlock();
    //这里用来计算sum的值.然后打印.因为sum是在函数内定义的局部变量.所以下面的代码是线程安全的.没必要用锁对这段代码进行保护.所以在上面用unlock解锁.
    int sum = 0;
    for (int i = 0; i < cnt; ++i)
    {
        sum += i;
    }
    //最后在手动加锁.不用手动释放.因为会在生命周期结束时自动释放.
    lock.lock();
    cout << std::this_thread::get_id() << " " << sum << endl;
}

而条件变量中的一些过程是需要释放锁的,所以在使用条件变量的时候,要用unique_lock而不是使用lock_guard。

搭配方式:

typedef std::shared_lock<std::shared_mutex> ReadLock;
typedef std::lock_guard<std::shared_mutex> WriteLock;

参考链接:https://www.jianshu.com/p/86abf93a05e7/

条件变量

https://blog.csdn.net/lv0918_qian/article/details/81745723

这篇关于c++读写锁和条件变量的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!