多线程生产者消费者c++
时间: 2023-09-18 10:05:42 浏览: 137
在C语言中实现多线程的生产者消费者模型可以使用线程库pthread。下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 5
int buffer[BUFFER_SIZE];
int count = 0; // 缓冲区中的数据数量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t empty = PTHREAD_COND_INITIALIZER; // 缓冲区为空的条件变量
pthread_cond_t full = 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(&empty, &mutex);
}
buffer[count++] = item; // 将物品放入缓冲区
printf("Producer produced item: %d\n", item);
pthread_cond_signal(&full); // 唤醒等待的消费者
pthread_mutex_unlock(&mutex); // 解锁
}
return NULL;
}
void* consumer(void* arg) {
int item;
while (1) {
pthread_mutex_lock(&mutex); // 加锁
while (count == 0) { // 如果缓冲区为空,等待
pthread_cond_wait(&full, &mutex);
}
item = buffer[--count]; // 从缓冲区取出物品
printf("Consumer consumed item: %d\n", item);
pthread_cond_signal(&empty); // 唤醒等待的生产者
pthread_mutex_unlock(&mutex); // 解锁
}
return 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;
}
```
这个示例代码中,定义了一个大小为5的缓冲区(使用数组实现),其中`count`变量表示缓冲区中的数据数量。生产者线程通过生成随机数作为物品,并将物品放入缓冲区。消费者线程从缓冲区中取出物品并进行消费。互斥锁`mutex`用于保护临界区资源的访问,条件变量`empty`和`full`用于实现生产者和消费者之间的同步。
请注意,这只是一个简单的示例代码,没有考虑线程安全性和错误处理。在实际使用中,还需要更加细致的设计和处理。
阅读全文