Linux中用C语言使用条件变量和线程实现消费者-生产者模型
时间: 2024-04-16 13:24:20 浏览: 130
在Linux中,可以使用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_prod = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond_cons = PTHREAD_COND_INITIALIZER;
void *producer(void *arg) {
int item = 0;
while (1) {
pthread_mutex_lock(&mutex);
// 如果缓冲区已满,则等待消费者消费
while (count == BUFFER_SIZE) {
pthread_cond_wait(&cond_prod, &mutex);
}
buffer[count] = item;
count++;
printf("Producer produced item %d\n", item);
// 唤醒消费者线程
pthread_cond_signal(&cond_cons);
pthread_mutex_unlock(&mutex);
item++;
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
while (1) {
pthread_mutex_lock(&mutex);
// 如果缓冲区为空,则等待生产者生产
while (count == 0) {
pthread_cond_wait(&cond_cons, &mutex);
}
int item = buffer[count - 1];
count--;
printf("Consumer consumed item %d\n", item);
// 唤醒生产者线程
pthread_cond_signal(&cond_prod);
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;
}
```
在上面的代码中,生产者线程不断地向缓冲区中生产数据,而消费者线程不断地从缓冲区中消费数据。当缓冲区满时,生产者线程会等待条件变量`cond_prod`,直到有消费者消费数据才会被唤醒。同样,当缓冲区为空时,消费者线程会等待条件变量`cond_cons`,直到有生产者生产数据才会被唤醒。
需要注意的是,在生产者和消费者线程之间共享的变量`count`和`buffer`需要进行互斥访问,因此使用了互斥锁`mutex`来保护共享资源的访问。
希望这个示例能帮助你理解如何在Linux中使用C语言的条件变量和线程实现消费者-生产者模型。
阅读全文