生产者消费者代码实现c语言
时间: 2023-05-09 22:04:02 浏览: 447
生产者消费者问题是一个经典的同步问题,主要解决线程之间的协调与同步问题。在生产者消费者问题中,生产者向缓冲区中放置物品,而消费者则从缓冲区中取出物品。缓冲区起到了生产者和消费者之间的桥梁作用。需要实现的是,生产者不会在缓冲区满的情况下放置物品,消费者不会在缓冲区为空的情况下取出物品。
以下是该问题的C语言代码实现:
``` c
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 5
int buffer[BUFFER_SIZE];
int counter = 0;
sem_t empty;
sem_t full;
void *producer(void *args) {
int item;
while (1) {
sem_wait(&empty);
item = produce_item();
if (counter < BUFFER_SIZE) {
buffer[counter] = item;
counter++;
printf("Producing item %d\n", item);
}
sem_post(&full);
}
}
void *consumer(void *args) {
int item;
while (1) {
sem_wait(&full);
if (counter > 0) {
item = buffer[counter-1];
counter--;
printf("Consuming item %d\n", item);
}
sem_post(&empty);
consume_item(item);
}
}
int main() {
pthread_t prod, cons;
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_create(&prod, NULL, producer, NULL);
pthread_create(&cons, NULL, consumer, NULL);
pthread_join(prod, NULL);
pthread_join(cons, NULL);
sem_destroy(&empty);
sem_destroy(&full);
return 0;
}
```
该代码中,使用了两个信号量:empty和full。empty信号量初始值为BUFFER_SIZE,表示缓冲区中可以放置的物品数量;full信号量初始值为0,表示缓冲区中当前没有物品。
在生产者线程中,通过等待empty信号量的值大于0,判断缓冲区是否已满;如果没有满,则向缓冲区中放置物品,并更新当前缓冲区中的计数器。在放置完成后,通过sem_post(&full)通知消费者线程,缓冲区中已经有物品可以取出。
在消费者线程中,通过等待full信号量的值大于0,判断缓冲区是否为空。如果不为空,则从缓冲区中取出最后一个物品,并更新缓冲区的计数器。在取出物品后,使用sem_post(&empty)通知生产者线程,缓冲区中已经有位置可以放置物品。
以上是生产者消费者问题的C语言实现,通过使用信号量来控制线程之间的同步和协调,在保证生产者和消费者工作流畅的同时,避免了数据的竞争和冲突。
阅读全文