写一个处理消费者生产者问题的C语言程序
时间: 2024-05-03 14:21:35 浏览: 76
利用数组解决生产者消费者问题
以下是一个基本的消费者生产者问题的C语言程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int count = 0; // 计数器,记录缓冲区中的元素个数
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 初始化互斥锁
pthread_cond_t full = PTHREAD_COND_INITIALIZER; // 初始化条件变量full
pthread_cond_t empty = PTHREAD_COND_INITIALIZER; // 初始化条件变量empty
void *producer(void *arg){
int item;
while(1){
item = rand() % 1000; // 产生一个随机数作为生产的物品
pthread_mutex_lock(&mutex); // 加锁
while(count == BUFFER_SIZE){ // 判断缓冲区是否已满
pthread_cond_wait(&empty, &mutex); // 如果已满,等待消费者取走物品
}
buffer[count] = item; // 将物品放入缓冲区
count++; // 计数器加1
printf("Producer produced item %d\n", item);
pthread_cond_signal(&full); // 唤醒等待物品的消费者
pthread_mutex_unlock(&mutex); // 解锁
}
pthread_exit(NULL);
}
void *consumer(void *arg){
int item;
while(1){
pthread_mutex_lock(&mutex); // 加锁
while(count == 0){ // 判断缓冲区是否为空
pthread_cond_wait(&full, &mutex); // 如果为空,等待生产者放入物品
}
item = buffer[count-1]; // 取出缓冲区中的一个物品
count--; // 计数器减1
printf("Consumer consumed item %d\n", item);
pthread_cond_signal(&empty); // 唤醒等待空位的生产者
pthread_mutex_unlock(&mutex); // 解锁
}
pthread_exit(NULL);
}
int main(){
pthread_t producer_thread, consumer_thread;
srand(time(NULL)); // 设置随机数种子
// 创建生产者和消费者线程
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
// 等待线程结束
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}
```
这个程序中,生产者线程不断地产生物品并放入缓冲区中,而消费者线程不断地从缓冲区中取出物品并消费。当缓冲区已满时,生产者线程会等待消费者线程取走物品后再继续放入物品;当缓冲区为空时,消费者线程会等待生产者线程放入物品后再继续取出物品。这样就可以保证线程之间的同步和互斥。
阅读全文