用c++模拟“读者-写者”问题,用信号量的思想实现
时间: 2023-11-27 08:54:33 浏览: 39
读者写者问题是一个经典的并发控制问题,它涉及到多个进程(或线程)对共享资源的访问。下面是一个使用信号量实现的C++代码示例。
```c++
#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <semaphore.h>
using namespace std;
const int READER_NUM = 5;
const int WRITER_NUM = 2;
sem_t rw_mutex; // 用于保证互斥访问
sem_t mutex; // 用于保护读者计数器
int reader_count = 0; // 读者计数器
void reader(int id) {
while (true) {
sem_wait(&mutex);
reader_count++;
if (reader_count == 1) {
sem_wait(&rw_mutex); // 第一个读者获取 rw_mutex
}
sem_post(&mutex);
// 读取数据
cout << "Reader " << id << " is reading." << endl;
this_thread::sleep_for(chrono::milliseconds(500));
sem_wait(&mutex);
reader_count--;
if (reader_count == 0) {
sem_post(&rw_mutex); // 最后一个读者释放 rw_mutex
}
sem_post(&mutex);
this_thread::sleep_for(chrono::milliseconds(1000));
}
}
void writer(int id) {
while (true) {
sem_wait(&rw_mutex); // 获取 rw_mutex
// 写入数据
cout << "Writer " << id << " is writing." << endl;
this_thread::sleep_for(chrono::milliseconds(1000));
sem_post(&rw_mutex); // 释放 rw_mutex
this_thread::sleep_for(chrono::milliseconds(2000));
}
}
int main() {
sem_init(&rw_mutex, 0, 1);
sem_init(&mutex, 0, 1);
thread readers[READER_NUM];
thread writers[WRITER_NUM];
for (int i = 0; i < READER_NUM; i++) {
readers[i] = thread(reader, i);
}
for (int i = 0; i < WRITER_NUM; i++) {
writers[i] = thread(writer, i);
}
for (int i = 0; i < READER_NUM; i++) {
readers[i].join();
}
for (int i = 0; i < WRITER_NUM; i++) {
writers[i].join();
}
sem_destroy(&rw_mutex);
sem_destroy(&mutex);
return 0;
}
```
在上面的代码中,我们使用了两个信号量:`rw_mutex`和`mutex`。`rw_mutex`用于保证读者和写者的互斥访问,`mutex`用于保护读者计数器。当有读者要访问共享资源时,它首先会获取`mutex`信号量,然后将读者计数器加1。如果它是第一个读者,就会获取`rw_mutex`信号量,否则就释放`mutex`信号量。读者读取完数据后,会再次获取`mutex`信号量,将读者计数器减1,如果这是最后一个读者,就会释放`rw_mutex`信号量。写者在访问共享资源时,直接获取`rw_mutex`信号量即可。
这样,我们就成功地使用信号量实现了读者写者问题。