c语言生产者消费问题
时间: 2024-06-30 10:01:09 浏览: 191
在计算机科学中,"生产者-消费者"(Producer-Consumer)问题是一个经典的并发编程示例,它涉及到两个线程角色:一个生产者(Producer),负责生成数据;另一个消费者(Consumer),负责处理这些数据。这个模型通常用信号量、条件变量或队列等同步原语来协调它们之间的交互,避免数据竞争和死锁。
在C语言中,你可以使用互斥锁(mutex)、条件变量(condition variable)或队列(如`std::queue`)来解决这个问题。下面是一个简单的C++代码示例:
```cpp
#include <pthread.h>
#include <queue>
// 定义生产者和消费者
struct Data {
int value;
};
void* producer(void* arg) {
std::queue<Data> queue;
// 生产数据并添加到队列
for (int i = 0; i < 10; ++i) {
Data data = {i};
pthread_mutex_lock(&mutex);
if (!queue.full()) {
queue.push(data);
pthread_cond_signal(&cv); // 唤醒消费者
}
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void* consumer(void* arg) {
Data data;
while (true) {
pthread_mutex_lock(&mutex);
while (queue.empty()) {
pthread_cond_wait(&cv, &mutex); // 当队列为空时等待
}
data = queue.front(); // 从队列中取出数据
queue.pop();
pthread_mutex_unlock(&mutex);
// 处理数据
printf("Consumed: %d\n", data.value);
}
pthread_exit(NULL);
}
int main() {
pthread_t producer_thread, consumer_thread;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cv, 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(&cv);
return 0;
}
```
阅读全文