帮我用C++写一个多线程编程中的读者和写者问题
时间: 2024-02-19 20:58:29 浏览: 201
天津大学计算机科学与技术专业操作系统读者写者问题C++实现
好的,以下是一个基于C++11标准的读者和写者问题的多线程实现:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
#include <vector>
using namespace std;
const int kNumReaders = 5; // 读者数量
const int kNumWriters = 2; // 写者数量
const int kNumReads = 20; // 读操作次数
const int kNumWrites = 10; // 写操作次数
int shared_data = 0; // 共享数据
mutex mtx; // 互斥锁
condition_variable cond; // 条件变量
int readers_waiting = 0; // 等待读者数量
bool writing = false; // 是否正在写操作
// 读者线程函数
void reader(int id) {
for (int i = 0; i < kNumReads; ++i) {
unique_lock<mutex> ul(mtx);
while (writing || readers_waiting > 0) {
cond.wait(ul);
}
++readers_waiting;
ul.unlock();
// 读操作
cout << "Reader " << id << " reads shared_data: " << shared_data << endl;
ul.lock();
--readers_waiting;
if (readers_waiting == 0) {
cond.notify_one();
}
ul.unlock();
this_thread::sleep_for(chrono::milliseconds(50)); // 模拟读操作耗时
}
}
// 写者线程函数
void writer(int id) {
for (int i = 0; i < kNumWrites; ++i) {
unique_lock<mutex> ul(mtx);
while (writing || readers_waiting > 0) {
cond.wait(ul);
}
writing = true;
ul.unlock();
// 写操作
++shared_data;
cout << "Writer " << id << " writes shared_data: " << shared_data << endl;
ul.lock();
writing = false;
cond.notify_all();
ul.unlock();
this_thread::sleep_for(chrono::milliseconds(100)); // 模拟写操作耗时
}
}
int main() {
vector<thread> tids;
// 创建读者线程
for (int i = 0; i < kNumReaders; ++i) {
tids.emplace_back(reader, i);
}
// 创建写者线程
for (int i = 0; i < kNumWriters; ++i) {
tids.emplace_back(writer, i);
}
// 等待所有线程结束
for (auto& t : tids) {
t.join();
}
return 0;
}
```
在该实现中,使用了一把互斥锁和一个条件变量来保护共享数据,并通过两个变量 `readers_waiting` 和 `writing` 来记录当前等待读者的数量和是否正在进行写操作。当有读者想要读取数据时,如果有写者正在进行写操作或者有其他读者正在等待,那么当前读者将被阻塞,并等待条件变量的通知。当有写者想要修改数据时,如果有其他写者正在进行写操作或者有读者正在等待,那么当前写者将被阻塞,并等待条件变量的通知。在读者和写者线程函数中,模拟了读写操作的耗时,以便更好地演示多线程并发的效果。
阅读全文