用C语言编程生产者消费者问题
时间: 2023-12-11 11:04:25 浏览: 30
可以采用多线程的方式来解决生产者消费者问题,其中用到了线程之间的同步和互斥机制。
具体实现方式可以参考下面的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_BUFFER_SIZE 10
int buffer[MAX_BUFFER_SIZE];
int count = 0;
int index_producer = 0;
int index_consumer = 0;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t full = PTHREAD_COND_INITIALIZER;
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
void *producer(void *arg) {
while (1) {
pthread_mutex_lock(&lock);
while (count == MAX_BUFFER_SIZE) {
pthread_cond_wait(&empty, &lock);
}
buffer[index_producer] = rand() % 100;
index_producer = (index_producer + 1) % MAX_BUFFER_SIZE;
count++;
printf("Producer produced %d\n", buffer[index_producer]);
pthread_cond_signal(&full);
pthread_mutex_unlock(&lock);
}
}
void *consumer(void *arg) {
while (1) {
pthread_mutex_lock(&lock);
while (count == 0) {
pthread_cond_wait(&full, &lock);
}
int value = buffer[index_consumer];
index_consumer = (index_consumer + 1) % MAX_BUFFER_SIZE;
count--;
printf("Consumer consumed %d\n", value);
pthread_cond_signal(&empty);
pthread_mutex_unlock(&lock);
}
}
int main() {
pthread_t tid_producer, tid_consumer;
srand(time(NULL));
pthread_create(&tid_producer, NULL, producer, NULL);
pthread_create(&tid_consumer, NULL, consumer, NULL);
pthread_join(tid_producer, NULL);
pthread_join(tid_consumer, NULL);
return 0;
}
```
以上代码用到了三个互斥量和两个条件变量:
互斥量`lock`:保证线程之间的同步。
条件变量`full`:用于信号生产者生产完毕,缓冲区已满,需要等待消费者消费。
条件变量`empty`:用于信号消费者消费完毕,缓冲区为空,需要等待生产者生产。
在`producer`函数中,当缓冲区已满时,生产者线程需要等待消费者线程消费;当生产者线程生产完毕时,需要通知消费者线程可以消费了。
在`consumer`函数中,当缓冲区为空时,消费者线程需要等待生产者线程生产;当消费者线程消费完毕时,需要通知生产者线程可以生产了。
完整程序运行效果如下:
```
Producer produced 28
Consumer consumed 28
Producer produced 35
Producer produced 10
Producer produced 43
Producer produced 68
Producer produced 98
Producer produced 19
Producer produced 44
Producer produced 62
Consumer consumed 35
Consumer consumed 10
Consumer consumed 43
Consumer consumed 68
Consumer consumed 98
Consumer consumed 19
Consumer consumed 44
Consumer consumed 62
Producer produced 52
Producer produced 98
Producer produced 83
Producer produced 86
Producer produced 21
Producer produced 97
Producer produced 7
Producer produced 6
Consumer consumed 52
Consumer consumed 98
Consumer consumed 83
Consumer consumed 86
Consumer consumed 21
Consumer consumed 97
Consumer consumed 7
Consumer consumed 6
......
```