生产者消费者问题c语言实现代码
时间: 2023-11-12 12:13:28 浏览: 113
生产者消费者问题的解决代码
3星 · 编辑精心推荐
以下是一个简单的生产者消费者问题的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 producer_condition = PTHREAD_COND_INITIALIZER;
pthread_cond_t consumer_condition = PTHREAD_COND_INITIALIZER;
void *producer(void *arg) {
int item;
while (1) {
item = rand() % 100; // 随机生成一个整数,模拟生产一个数据项
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) {
pthread_cond_wait(&producer_condition, &mutex); // 如果缓冲区已满,等待消费者取走数据
}
buffer[count++] = item;
printf("Producer produced %d\n", item);
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&consumer_condition); // 通知一个消费者可以取走数据了
}
}
void *consumer(void *arg) {
int item;
while (1) {
pthread_mutex_lock(&mutex);
while (count == 0) {
pthread_cond_wait(&consumer_condition, &mutex); // 如果缓冲区已空,等待生产者产生数据
}
item = buffer[--count];
printf("Consumer consumed %d\n", item);
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&producer_condition); // 通知一个生产者可以继续生产数据了
}
}
int main(int argc, char *argv[]) {
pthread_t p, c;
srand((unsigned int) time(NULL));
pthread_create(&p, NULL, producer, NULL);
pthread_create(&c, NULL, consumer, NULL);
pthread_join(p, NULL);
pthread_join(c, NULL);
return 0;
}
```
这个代码使用了互斥锁和条件变量来实现线程间的同步与通信。生产者线程随机生成一个整数,将其放入缓冲区中,同时通知一个消费者线程可以取走数据;消费者线程从缓冲区中取走一个数据,同时通知一个生产者线程可以继续生产数据。这种方法可以避免竞争条件和死锁问题。
阅读全文