5线程同步-实现读写锁扩展C++11标准库

在C++11标准库中实现了线程的重要基本设施,使用这些功能轻松构建复杂的多线程程序,但是比起微软或者第三库功能还是不怎么全面,比如读写锁就没有实现,但是可以利用已有的功能,轻松实现一个读写锁。代码如下:

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

using namespace std;

class shared_mutex
{
private:
    // 锁
    mutex m_mutex;
    // 条件变量
    condition_variable m_cond;
    // 是否在写
    bool m_is_w = false;
    // 读者数量
    size_t m_read_c = 0;
    // 读条件
    bool read_cond() const
    {
        return false == m_is_w;
    }
    // 写条件
    bool write_cond() const
    {
        return false == m_is_w && 0 == m_read_c;
    }

public:
    void read()
    {
        unique_lock<mutex> lck(m_mutex);
        // 函数可能睡眠
        m_cond.wait(lck, bind(&shared_mutex::read_cond, this));
        m_read_c++;
    }

    void unread()
    {
        unique_lock<mutex> lck(m_mutex);
        m_read_c--;
        m_cond.notify_all();
    }
    
    void write()
    {
        unique_lock<mutex> lck(m_mutex);
        // 匿名函数如果不传指针,当唤醒的时候变量的值依然是睡眠时候的值,
        // 导致函数不能唤醒成功
        m_cond.wait(lck, bind([](const bool *is_w, const size_t *read_c) -> bool
        {
            return false == *is_w && 0 == *read_c;
        }, &m_is_w, &m_read_c));
        m_is_w = true;
    }

    void unwrite()
    {
        unique_lock<mutex> lck(m_mutex);
        m_is_w = false;
        m_cond.notify_all();
    }
};

class read_lock
{
private:
    shared_mutex *m_sm;
public:
    read_lock(shared_mutex &sm)
    {
        m_sm = &sm;
        m_sm->read();
    }
    ~read_lock()
    {
        m_sm->unread();
    }
};

class write_lock
{
private:
    shared_mutex *m_sm;
public:
    write_lock(shared_mutex &sm)
    {
        m_sm = &sm;
        m_sm->write();
    }
    ~write_lock()
    {
        m_sm->unwrite();
    }
};

// 下面是测试代码
shared_mutex sm;

void read(int id)
{
    read_lock lck(sm);
    printf("%d r \n",id);
    this_thread::sleep_for(chrono::milliseconds(300));
    printf("%d r end \n",id);
}

void write(int id)
{
    write_lock lck(sm);
    printf("%d w \n", id);
    this_thread::sleep_for(chrono::milliseconds(300));
    printf("%d w end \n", id);
}

int test_read_write()
{
    thread t1(read, 1);
    thread t2(write, 2);
    thread t3(write, 3);
    thread t4(read, 4);
    t1.join();
    t2.join();
    t3.join();
    t4.join();
    return 0;
}

// atomic 在硬件的支持下,为多线程提供了基本的原子操作
// mutex 在atomic支持下为多线程提供了更长的原子尺度(为程序员抽象出来临界区)
// condition_variable 在mutex的支持下为多线提供了更多的控制关系(为程序员抽象出来同步)

欢迎各位大侠指正交流。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的(ReadWrite Lock)是一种线同步机制,用于在多线程环境下实现对共享资源的操作。它允许多个线程同时取共享资源,但只允许一个线程进行操作。 在C++中,实现通常使用std::shared_mutex类(也称为shared_mutex)来实现。它是C++14标准引入的一个新特性,提供了的功能。 使用std::shared_mutex时,可以使用两种不同的来进行操作: 1. std::shared_lock:用于共享资源的取操作。多个线程可以同时获取共享,并且不会阻塞彼此。 2. std::unique_lock:用于独占资源的入操作。只允许一个线程获取独占,并且其他线程无法获取共享。 通过使用这两种不同的,可以实现对共享资源的操作的并发性。 下面是一个简单的示例代码,演示了如何使用std::shared_mutex实现: ```cpp #include <iostream> #include <shared_mutex> #include <thread> std::shared_mutex rwMutex; int sharedData = 0; void ReadData() { std::shared_lock<std::shared_mutex> lock(rwMutex); std::cout << "Read data: " << sharedData << std::endl; } void WriteData() { std::unique_lock<std::shared_mutex> lock(rwMutex); sharedData++; std::cout << "Write data: " << sharedData << std::endl; } int main() { std::thread t1(ReadData); std::thread t2(ReadData); std::thread t3(WriteData); t1.join(); t2.join(); t3.join(); return 0; } ``` 在上述示例中,三个线程分别执行了取操作和入操作。使用std::shared_lock获取共享实现取操作,使用std::unique_lock获取独占实现入操作。这样可以保证在入操作时不会有其他线程同时进行取或入操作。 需要注意的是,std::shared_mutex是C++14引入的特性,因此在使用之前,请确保编译器支持C++14标准。如果编译器不支持C++14,也可以使用第三方或自行实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值