生产者消费者问题c语言实现
时间: 2023-08-13 16:03:48 浏览: 398
利用数组解决生产者消费者问题
生产者消费者问题是一个经典的多线程同步问题,可以用信号量或互斥锁实现。下面是一个使用互斥锁和条件变量解决生产者消费者问题的 C 语言实现:
```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; // 缓冲区满条件变量
pthread_cond_t empty = PTHREAD_COND_INITIALIZER; // 缓冲区空条件变量
void *producer(void *arg) {
int item = 0;
while (1) {
pthread_mutex_lock(&mutex);
if (count == BUFFER_SIZE) { // 缓冲区满了,等待消费者消费
pthread_cond_wait(&full, &mutex);
}
buffer[count++] = item++; // 生产一个物品
printf("Producer produced item %d\n", item);
pthread_cond_signal(&empty); // 通知消费者有物品可取
pthread_mutex_unlock(&mutex);
}
}
void *consumer(void *arg) {
int item;
while (1) {
pthread_mutex_lock(&mutex);
if (count == 0) { // 缓冲区空了,等待生产者生产
pthread_cond_wait(&empty, &mutex);
}
item = buffer[--count]; // 消费一个物品
printf("Consumer consumed item %d\n", item);
pthread_cond_signal(&full); // 通知生产者有空闲缓冲区
pthread_mutex_unlock(&mutex);
}
}
int main() {
pthread_t producer_thread, consumer_thread;
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;
}
```
在这个程序中,生产者不断地往缓冲区中生产物品,如果缓冲区已经满了,就等待消费者消费;消费者不断地从缓冲区中取出物品消费,如果缓冲区已经空了,就等待生产者生产。生产者和消费者之间通过条件变量进行通信,缓冲区中的数据个数通过互斥锁进行保护。
阅读全文