参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。为了使得程序的输出易于看到结果,仿照的实例程序,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。C++写
时间: 2024-01-21 22:17:57 浏览: 61
生产者消费者进程c++
4星 · 用户满意度95%
下面是一个简单的生产者消费者算法的代码实现:
```cpp
#include <iostream>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <thread>
#include <cstdlib>
#include <ctime>
using namespace std;
queue<char> buffer; // 缓冲区
mutex mtx; // 互斥锁
condition_variable cv; // 条件变量
void producer(char c) {
while (true) {
this_thread::sleep_for(chrono::milliseconds(rand() % 500)); // 随机睡眠一段时间
unique_lock<mutex> lock(mtx);
cv.wait(lock, [] { return buffer.size() < 10; }); // 等待缓冲区不满
buffer.push(c);
cout << "生产者" << this_thread::get_id() << "生产了" << c << endl;
cv.notify_all(); // 通知所有等待的线程
}
}
void consumer() {
while (true) {
this_thread::sleep_for(chrono::milliseconds(rand() % 500)); // 随机睡眠一段时间
unique_lock<mutex> lock(mtx);
cv.wait(lock, [] { return !buffer.empty(); }); // 等待缓冲区不空
char c = buffer.front();
buffer.pop();
cout << "消费者" << this_thread::get_id() << "消费了" << c << endl;
cv.notify_all(); // 通知所有等待的线程
}
}
int main() {
srand(time(nullptr));
thread producer1(producer, 'A'); // 生产者1,生产大写字母
thread producer2(producer, 'a'); // 生产者2,生产小写字母
thread consumer1(consumer); // 消费者1
thread consumer2(consumer); // 消费者2
thread consumer3(consumer); // 消费者3
producer1.join();
producer2.join();
consumer1.join();
consumer2.join();
consumer3.join();
return 0;
}
```
这个程序创建了5个线程,其中2个是生产者线程,3个是消费者线程。生产者线程不断地向缓冲区中写入字符,而消费者线程不断地从缓冲区中读取字符并输出。为了防止线程间的竞争,使用了互斥锁和条件变量。如果缓冲区已满,生产者线程会等待条件变量的通知;如果缓冲区为空,消费者线程也会等待条件变量的通知。
阅读全文