C++ 实现读写锁的示例

107 篇文章 0 订阅
49 篇文章 0 订阅
下面是一个简单的 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)以及共享的计数器和标志位来实现读写锁的功能,并确保读者和写者之间的互斥和同步。

  • 51
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 48
    评论
QReadWriteLock是Qt提供的实现类,它可以提高多线程程序的效率。下面是一个QReadWriteLock的示例: ```c++ #include <QCoreApplication> #include <QReadWriteLock> #include <QThread> #include <QDebug> QReadWriteLock rwLock; // 创建 int data = 0; // 共享数据 void readData() // 线程 { while (true) { rwLock.lockForRead(); // 获取 qDebug() << "Read data:" << data; rwLock.unlock(); // 释放 QThread::msleep(500); } } void writeData() // 线程 { while (true) { rwLock.lockForWrite(); // 获取 data++; // 修改共享数据 qDebug() << "Write data:" << data; rwLock.unlock(); // 释放 QThread::msleep(1000); } } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建两个线程和一个线程 QThread thread1, thread2, thread3; QObject::connect(&thread1, &QThread::started, readData); QObject::connect(&thread2, &QThread::started, readData); QObject::connect(&thread3, &QThread::started, writeData); thread1.start(); thread2.start(); thread3.start(); return a.exec(); } ``` 在这个示例中,我们创建了一个全局的QReadWriteLock对象rwLock和一个共享变量data。同时,我们创建了两个线程和一个线程,线程不断地取共享变量data的值,线程不断地修改data的值。我们通过lockForRead()和unlock()方法获取和释放,通过lockForWrite()和unlock()方法获取和释放。这样,我们就实现的功能,保证多个线程能够安全地访问共享数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Respect@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值