C++ 实现读写锁的示例

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

#include 
#include 
#include 

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)以及共享的计数器和标志位来实现读写锁的功能,并确保读者和写者之间的互斥和同步。

你可能感兴趣的:(笔记,Linux进阶,C++,c++,开发语言,nginx,服务器,C)