生产者消费者问题,2个生产者,3个消费者。一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。为了使得程序的输出易于看到结果,仿照的实例程序,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。请给出c代码并分析
时间: 2024-01-22 18:20:17 浏览: 76
下面是一个简单的C语言实现生产者消费者问题的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>
#define BUFFER_SIZE 5 // 缓冲区大小
#define MAX_ITER 10 // 生产者和消费者操作的最大次数
char buffer[BUFFER_SIZE]; // 缓冲区
int in = 0, out = 0; // 缓冲区指针
sem_t empty, full; // 信号量
void *producer_uppercase(void *arg)
{
int i;
char ch;
for (i = 0; i < MAX_ITER; i++) {
ch = (rand() % 26) + 'A'; // 随机生成大写字母
sem_wait(&empty);
buffer[in] = ch;
in = (in + 1) % BUFFER_SIZE;
printf("Producer (uppercase) produced %c\n", ch);
sem_post(&full);
sleep(rand() % 2); // 随机睡眠一段时间
}
pthread_exit(NULL);
}
void *producer_lowercase(void *arg)
{
int i;
char ch;
for (i = 0; i < MAX_ITER; i++) {
ch = (rand() % 26) + 'a'; // 随机生成小写字母
sem_wait(&empty);
buffer[in] = ch;
in = (in + 1) % BUFFER_SIZE;
printf("Producer (lowercase) produced %c\n", ch);
sem_post(&full);
sleep(rand() % 2); // 随机睡眠一段时间
}
pthread_exit(NULL);
}
void *consumer(void *arg)
{
int i;
char ch;
for (i = 0; i < MAX_ITER*2; i++) {
sem_wait(&full);
ch = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumer consumed %c\n", ch);
sem_post(&empty);
sleep(rand() % 2); // 随机睡眠一段时间
}
pthread_exit(NULL);
}
int main()
{
pthread_t prod_upper, prod_lower, cons1, cons2, cons3;
srand(time(NULL)); // 初始化随机数生成器
sem_init(&empty, 0, BUFFER_SIZE); // 初始化信号量
sem_init(&full, 0, 0);
// 创建生产者和消费者线程
pthread_create(&prod_upper, NULL, producer_uppercase, NULL);
pthread_create(&prod_lower, NULL, producer_lowercase, NULL);
pthread_create(&cons1, NULL, consumer, NULL);
pthread_create(&cons2, NULL, consumer, NULL);
pthread_create(&cons3, NULL, consumer, NULL);
// 等待线程结束
pthread_join(prod_upper, NULL);
pthread_join(prod_lower, NULL);
pthread_join(cons1, NULL);
pthread_join(cons2, NULL);
pthread_join(cons3, NULL);
sem_destroy(&empty); // 销毁信号量
sem_destroy(&full);
return 0;
}
```
上述代码中,我们使用了两个生产者线程来分别生成大写字母和小写字母,以及三个消费者线程来从缓冲区中读取字符并输出。使用信号量来实现对缓冲区的互斥访问和同步操作。在生产者和消费者线程中加入了随机睡眠时间,使得输出结果更加有趣。
阅读全文