C++ 实现读写锁的代码详解

 更新时间:2023年10月19日 08:46:09   作者:Respect@  
C++读写锁是一种多线程同步机制,它允许多个线程同时读取共享数据,但只允许一个线程写入共享数据,这种锁可以提高程序的并发性和性能,本文给大家介绍了C++ 实现读写锁的代码,需要的朋友可以参考下

下面是一个简单的 C++ 实现读写锁的示例:

#include <iostream>
#include <mutex>
#include <condition_variable>

class ReadWriteLock {
private:
    std::mutex mutex_;
    std::condition_variable read_cv_;
    std::condition_variable write_cv_;
    int readers_;
    bool writing_;

public:
    ReadWriteLock() : readers_(0), writing_(false) {}

    void lockRead() {
        std::unique_lock<std::mutex> lock(mutex_);
        // 如果有线程正在进行写操作或者等待写操作,则阻塞等待
        while (writing_) {
            read_cv_.wait(lock);
        }
        readers_++;
    }

    void unlockRead() {
        std::unique_lock<std::mutex> lock(mutex_);
        readers_--;
        if (readers_ == 0) {
            write_cv_.notify_one(); // 唤醒等待写操作的线程
        }
    }

    void lockWrite() {
        std::unique_lock<std::mutex> lock(mutex_);
        // 如果有线程正在读或写,则阻塞等待
        while (writing_ || readers_ > 0) {
            write_cv_.wait(lock);
        }
        writing_ = true;
    }

    void unlockWrite() {
        std::unique_lock<std::mutex> lock(mutex_);
        writing_ = false;
        read_cv_.notify_all();  // 唤醒等待读操作的线程
        write_cv_.notify_one(); // 唤醒等待写操作的线程
    }
};

// 示例用法
ReadWriteLock rwLock;

void readerFunction(int id) {
    while (true) {
        rwLock.lockRead();
        // 执行读取操作
        std::cout << "Reader " << id << " is reading" << std::endl;
        rwLock.unlockRead();
        // 休眠一段时间模拟读取过程
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }
}

void writerFunction(int id) {
    while (true) {
        rwLock.lockWrite();
        // 执行写入操作
        std::cout << "Writer " << id << " is writing" << std::endl;
        rwLock.unlockWrite();
        // 休眠一段时间模拟写入过程
        std::this_thread::sleep_for(std::chrono::milliseconds(2000));
    }
}

int main() {
    // 创建多个读者线程和写者线程进行测试
    std::thread readers[3];
    std::thread writers[2];

    for (int i = 0; i < 3; i++) {
        readers[i] = std::thread(readerFunction, i);
    }

    for (int i = 0; i < 2; i++) {
        writers[i] = std::thread(writerFunction, i);
    }

    // 等待所有线程结束
    for (auto& reader : readers) {
        reader.join();
    }

    for (auto& writer : writers) {
        writer.join();
    }

    return 0;
}

在上述示例中,ReadWriteLock 类实现了读写锁的基本功能。lockRead() 和 unlockRead() 方法用于获取和释放读锁,lockWrite() 和 unlockWrite() 方法用于获取和释放写锁。

在主函数中,创建了多个读者线程和写者线程来模拟并发读写操作。读者线程使用 lockRead() 和 unlockRead() 获取和释放读锁,写者线程使用 lockWrite() 和 unlockWrite() 获取和释放写锁。

通过使用互斥量(std::mutex)、条件变量(std::condition_variable)以及共享的计数器和标志位来实现读写锁的功能,并确保读者和写者之间的互斥和同步。

到此这篇关于C++ 实现读写锁的代码详解的文章就介绍到这了,更多相关C++ 实现读写锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现职工工资管理系统的示例代码

    C语言实现职工工资管理系统的示例代码

    这篇文章主要为大家详细介绍了C语言如何实现职工工资管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言实现打飞机小游戏

    C语言实现打飞机小游戏

    这篇文章主要为大家详细介绍了C语言实现简单的打飞机小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • c++ qt自定义搜索编辑框的实现方法

    c++ qt自定义搜索编辑框的实现方法

    这篇文章主要介绍了c++ qt自定义搜索编辑框,通过自定义QLineEdit,在编辑框里添加布局,将按钮设置在右边,当点击按钮搜索按钮时发送信号到主界面做相应的操作,需要的朋友可以参考下
    2022-03-03
  • C语言自制测色弱找方块游戏的示例代码

    C语言自制测色弱找方块游戏的示例代码

    这篇文章主要介绍了基于C语言自制测色弱找方块的游戏。该游戏是仿照最近网上流行的找方块游戏编写的,可玩性还是挺高的,感兴趣的可以了解一下
    2022-12-12
  • C++ 继承的范例讲解

    C++ 继承的范例讲解

    继承是C++面向对象编程中的一门。继承是子类继承父类的特征和行为,或者是继承父类得方法,使的子类具有父类得的特性和行为。重写是子类对父类的允许访问的方法实行的过程进行重新编写,返回值和形参都不能改变。就是对原本的父类进行重新编写,但是外部接口不能被重写
    2022-06-06
  • 基于C语言char与unsigned char的区别介绍

    基于C语言char与unsigned char的区别介绍

    本篇文章小编为大家介绍,基于C语言char与unsigned char的区别介绍。需要的朋友参考下
    2013-04-04
  • 详解C++实现拓扑排序算法

    详解C++实现拓扑排序算法

    拓扑排序是对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。本文将对其原理进行讲解,并且用C++进行实现
    2021-06-06
  • 枚举和宏的区别详细解析

    枚举和宏的区别详细解析

    枚举常量具有类型,但宏没有类型,枚举变量具有与普通变量相同的诸如作用域、值等性质,但宏没有,宏不是语言的一部分,它是一种预处理替换符
    2013-09-09
  • C语言 fscanf 和 fprintf函数示例详解

    C语言 fscanf 和 fprintf函数示例详解

    这篇文章主要介绍了 C语言 fscanf 和 fprintf函数示例详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-12-12
  • C++中的delete不会将操作数置0

    C++中的delete不会将操作数置0

    这篇文章主要介绍了C++中的delete不会将操作数置0的相关资料,需要的朋友可以参考下
    2016-05-05

最新评论