用 c++ 实现
时间: 2024-02-21 09:01:46 浏览: 65
下面是基于C++的实现:
```cpp
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
#include <random>
using namespace std;
// 共享缓冲区
queue<char> buffer;
// 信号量
condition_variable full;
condition_variable empty;
mutex mtx;
// 生产者线程函数
void producer(int id, char letter) {
while (true) {
// 随机睡眠一段时间
this_thread::sleep_for(chrono::milliseconds(rand() % 1000));
// 随机生成一个字母
char c = (letter == 'A') ? (rand() % 26 + 'A') : (rand() % 26 + 'a');
// 获取锁
unique_lock<mutex> lock(mtx);
while (buffer.size() == 10) { // 缓冲区已满
empty.wait(lock); // 阻塞生产者线程
}
// 将生成的字母放入共享缓冲区
buffer.push(c);
cout << "Producer " << id << " produced: " << c << endl;
// 释放锁
full.notify_one();
}
}
// 消费者线程函数
void consumer(int id) {
while (true) {
// 随机睡眠一段时间
this_thread::sleep_for(chrono::milliseconds(rand() % 1000));
// 获取锁
unique_lock<mutex> lock(mtx);
while (buffer.size() == 0) { // 缓冲区为空
full.wait(lock); // 阻塞消费者线程
}
// 从共享缓冲区中取出一个字符
char c = buffer.front();
buffer.pop();
cout << "Consumer " << id << " consumed: " << c << endl;
// 释放锁
empty.notify_one();
}
}
int main() {
// 创建2个生产者进程和3个消费者进程
thread p1(producer, 1, 'A');
thread p2(producer, 2, 'a');
thread c1(consumer, 1);
thread c2(consumer, 2);
thread c3(consumer, 3);
// 等待线程结束
p1.join();
p2.join();
c1.join();
c2.join();
c3.join();
return 0;
}
```
在这个实现中,生产者进程通过随机生成一个字母来模拟不断在共享缓冲区中写入字符的过程。消费者进程通过从共享缓冲区中取出一个字符并输出来模拟不断从共享缓冲区中读取字符的过程。为了保证多线程的同步和互斥,使用了条件变量和互斥锁来控制线程的执行顺序和访问共享资源的互斥。同时,为了使得输出结果更加易于观察,使用了随机睡眠时间来模拟生产者和消费者的不同速度。
阅读全文