读者写者问题C++代码
时间: 2024-09-06 08:07:43 浏览: 92
reader-and-writer.zip_读者写者
在计算机科学中,读者写者问题是关于并发控制的一个经典例子,它描述了一个场景,其中有一群读者同时访问一个共享资源,而只允许一个写者修改该资源。C++中可以通过互斥量(mutex)、条件变量(condition_variable)等同步原语来解决这个问题。下面是一个简单的线程安全版本的C++代码示例:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
bool is_writer = false; // 标记是否正在写入
std::condition_variable cv;
void reader() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !is_writer; }); // 等待写作完成
std::cout << "Reader entered" << std::endl;
// 读者读取资源...
lock.unlock();
cv.notify_one(); // 让潜在的写者继续
}
void writer() {
std::unique_lock<std::mutex> lock(mtx);
is_writer = true; // 设置正在写入状态
std::cout << "Writer entered" << std::endl;
// 写入资源...
lock.unlock();
is_writer = false; // 清除写入状态
cv.notify_all(); // 唤醒所有等待的读者
}
int main() {
std::thread t1(reader), t2(reader), t3(writer); // 创建两个读者和一个写者线程
t1.join();
t2.join();
t3.join();
return 0;
}
```
在这个例子中,`reader`函数先获取互斥锁,然后等待`writer`标志变为假,表示可以读取。当`writer`完成并释放互斥锁后,`reader`会继续执行,并通知其他等待的读者。同样,`writer`在完成操作后,设置`is_writer`为假并唤醒所有等待的读者。
阅读全文