消费者生产者模型代码、
时间: 2023-08-07 13:05:23 浏览: 43
下面是一个使用互斥锁和条件变量实现的生产者消费者模型的示例代码。
```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_cond_t buffer_not_full; // 缓冲区非满条件变量
pthread_cond_t buffer_not_empty; // 缓冲区非空条件变量
void produce(int item) {
buffer[count] = item;
count++;
}
int consume() {
int item = buffer[count - 1];
count--;
return item;
}
void *producer(void *arg) {
int item = 0;
while (1) {
pthread_mutex_lock(&mutex); // 加锁
while (count == BUFFER_SIZE) {
pthread_cond_wait(&buffer_not_full, &mutex); // 等待缓冲区非满
}
produce(item);
printf("Producer produced item %d\n", item);
item++;
pthread_cond_signal(&buffer_not_empty); // 唤醒消费者
pthread_mutex_unlock(&mutex); // 解锁
}
}
void *consumer(void *arg) {
int item = 0;
while (1) {
pthread_mutex_lock(&mutex); // 加锁
while (count == 0) {
pthread_cond_wait(&buffer_not_empty, &mutex); // 等待缓冲区非空
}
item = consume();
printf("Consumer consumed item %d\n", item);
pthread_cond_signal(&buffer_not_full); // 唤醒生产者
pthread_mutex_unlock(&mutex); // 解锁
}
}
int main() {
pthread_t producer_thread, consumer_thread;
// 初始化互斥锁和条件变量
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&buffer_not_full, NULL);
pthread_cond_init(&buffer_not_empty, 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);
// 销毁互斥锁和条件变量
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&buffer_not_full);
pthread_cond_destroy(&buffer_not_empty);
return 0;
}
```
在这个示例代码中,生产者和消费者线程都通过互斥锁和条件变量来同步它们之间的操作。当缓冲区非满时,生产者可以往缓冲区中添加元素,并通过条件变量 `buffer_not_empty` 唤醒等待的消费者;当缓冲区非空时,消费者可以从缓冲区中取出元素,并通过条件变量 `buffer_not_full` 唤醒等待的生产者。同时,为了避免死锁的发生,这里使用了条件变量的 while 循环来避免假唤醒的情况。