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++11中std::move、std::forward、左右值引用、移动构造函数的测试问题
这篇文章主要介绍了C++11中std::move、std::forward、左右值引用、移动构造函数的测试,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-09-09
最新评论