写一个 c++ 生产者消费者模型
时间: 2024-05-15 11:16:20 浏览: 91
生产者 消费者 模式 c++
4星 · 用户满意度95%
以下是一个简单的 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 cond = PTHREAD_COND_INITIALIZER; // 条件变量
void *producer(void *arg)
{
int i;
for (i = 0; i < BUFFER_SIZE; i++) {
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) { // 缓冲区满了
pthread_cond_wait(&cond, &mutex); // 等待消费者消费
}
buffer[count++] = i; // 生产物品并放入缓冲区
printf("producer produced %d\n", i);
pthread_cond_signal(&cond); // 通知消费者可以消费了
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void *consumer(void *arg)
{
int i;
for (i = 0; i < BUFFER_SIZE; i++) {
pthread_mutex_lock(&mutex);
while (count == 0) { // 缓冲区空了
pthread_cond_wait(&cond, &mutex); // 等待生产者生产
}
int item = buffer[--count]; // 从缓冲区取出物品并消费
printf("consumer consumed %d\n", item);
pthread_cond_signal(&cond); // 通知生产者可以生产了
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
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;
}
```
在上面的代码中,生产者线程和消费者线程共享一个缓冲区数组和一个计数器。生产者向缓冲区中添加物品,并将计数器加一;消费者从缓冲区中取出物品,并将计数器减一。如果缓冲区已满,生产者就会等待消费者消费;如果缓冲区已空,消费者就会等待生产者生产。在等待过程中,线程会释放互斥锁,以允许其他线程访问缓冲区。当条件变量发生变化时,线程会重新获取互斥锁并继续执行。
阅读全文