参考生产者消费者算法,使用C++在linux环境下编写一个程序,要求是:创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。为了使得程序的输出易于看到结果,仿照的实例程序,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。
时间: 2024-03-14 12:46:24 浏览: 60
好的,以下是代码实现,注释中有详细的说明:
```c++
#include <iostream>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <cstdlib>
#include <ctime>
using namespace std;
const int BUFFER_SIZE = 3; // 缓冲区大小
char buffer[BUFFER_SIZE]; // 缓冲区
int in = 0; // 生产者写入位置
int out = 0; // 消费者读取位置
sem_t empty; // 空缓冲区信号量
sem_t full; // 满缓冲区信号量
sem_t mutex; // 互斥信号量
// 生产者线程函数
void *producer(void *arg) {
char c = *(char *)arg;
while (true) {
// 随机睡眠一段时间,模拟生产过程
sleep(rand() % 5 + 1);
// 生产者等待空缓冲区
sem_wait(&empty);
// 互斥访问缓冲区
sem_wait(&mutex);
buffer[in] = c;
cout << "Producer " << c << " produces " << buffer[in] << endl;
in = (in + 1) % BUFFER_SIZE;
sem_post(&mutex);
// 发出满缓冲区信号
sem_post(&full);
}
pthread_exit(NULL);
}
// 消费者线程函数
void *consumer(void *arg) {
while (true) {
// 随机睡眠一段时间,模拟消费过程
sleep(rand() % 5 + 1);
// 消费者等待满缓冲区
sem_wait(&full);
// 互斥访问缓冲区
sem_wait(&mutex);
char c = buffer[out];
cout << "Consumer consumes " << c << endl;
out = (out + 1) % BUFFER_SIZE;
sem_post(&mutex);
// 发出空缓冲区信号
sem_post(&empty);
}
pthread_exit(NULL);
}
int main() {
srand(time(NULL));
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
sem_init(&mutex, 0, 1);
pthread_t producer1, producer2, consumer1, consumer2, consumer3;
char c1 = 'A', c2 = 'a';
// 创建生产者线程
pthread_create(&producer1, NULL, producer, &c1);
pthread_create(&producer2, NULL, producer, &c2);
// 创建消费者线程
pthread_create(&consumer1, NULL, consumer, NULL);
pthread_create(&consumer2, NULL, consumer, NULL);
pthread_create(&consumer3, NULL, consumer, NULL);
// 等待线程结束
pthread_join(producer1, NULL);
pthread_join(producer2, NULL);
pthread_join(consumer1, NULL);
pthread_join(consumer2, NULL);
pthread_join(consumer3, NULL);
sem_destroy(&empty);
sem_destroy(&full);
sem_destroy(&mutex);
return 0;
}
```
在程序中,我们使用了三个信号量:`empty` 表示空缓冲区数量,`full` 表示满缓冲区数量,`mutex` 表示互斥量,用于保证在访问缓冲区时只有一个线程在进行操作。在实现生产者和消费者线程函数时,我们使用了信号量的 `wait` 和 `post` 操作来进行同步和互斥。同时,在生产者和消费者线程函数中,我们使用了 `sleep` 函数来模拟生产和消费的过程,使得程序的输出更加真实。
阅读全文