赞
踩
在 Linux 系统中,生产者和消费者问题是一个经典的多线程同步问题,用于描述如何在多线程环境中协调多个线程对共享资源的访问。这个问题通常涉及两个类型的线程:生产者线程和消费者线程。生产者线程负责生成数据并将其放入缓冲区,而消费者线程则从缓冲区中取出数据进行处理。
生产者(Producer):
消费者(Consumer):
为了确保线程安全并避免竞态条件,生产者和消费者通常使用以下同步机制:
互斥锁(Mutex):
条件变量(Condition Variable):
让我们用一个更生动的例子来解释生产者-消费者问题中的条件变量和互斥锁的工作机制。
想象一下,有一个餐厅,里面有一个厨房(缓冲区)和一个用餐区。餐厅有两种工作人员:厨师(生产者)和服务员(消费者)。他们之间的协调就像在处理生产者-消费者问题。
厨师做菜并放在桌子上:
服务员拿菜并送到顾客那里:
以下代码片段展示了这个过程:
- #include <pthread.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
-
- #define BUFFER_SIZE 10
-
- int buffer[BUFFER_SIZE];
- int count = 0;
-
- pthread_mutex_t mutex;
- pthread_cond_t cond_producer;
- pthread_cond_t cond_consumer;
-
- void* producer(void* arg) {
- while (1) {
- // 生成数据(例如:随机数)
- int item = rand() % 100;
-
- pthread_mutex_lock(&mutex);
-
- // 等待缓冲区有空位
- while (count == BUFFER_SIZE) {
- pthread_cond_wait(&cond_producer, &mutex);
- }
-
- // 将数据放入缓冲区
- buffer[count++] = item;
- printf("Produced: %d\n", item);
-
- // 通知消费者有数据可用
- pthread_cond_signal(&cond_consumer);
-
- pthread_mutex_unlock(&mutex);
-
- // 模拟生产时间
- sleep(1);
- }
- }
-
- void* consumer(void* arg) {
- while (1) {
- pthread_mutex_lock(&mutex);
-
- // 等待缓冲区有数据
- while (count == 0) {
- pthread_cond_wait(&cond_consumer, &mutex);
- }
-
- // 从缓冲区取出数据
- int item = buffer[--count];
- printf("Consumed: %d\n", item);
-
- // 通知生产者有空位可用
- pthread_cond_signal(&cond_producer);
-
- pthread_mutex_unlock(&mutex);
-
- // 模拟消费时间
- sleep(1);
- }
- }
-
- int main() {
- pthread_t producer_thread, consumer_thread;
-
- pthread_mutex_init(&mutex, NULL);
- pthread_cond_init(&cond_producer, NULL);
- pthread_cond_init(&cond_consumer, 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(&cond_producer);
- pthread_cond_destroy(&cond_consumer);
-
- return 0;
- }
运行结果:
互斥锁(pthread_mutex_t mutex):
条件变量(pthread_cond_t cond_producer 和 pthread_cond_t cond_consumer):
cond_producer
是厨师用来等待服务员拿走菜的信号灯。cond_consumer
是服务员用来等待厨师放菜的信号灯。厨师(producer):
cond_producer
信号)。cond_consumer
信号)。服务员(consumer):
cond_consumer
信号)。cond_producer
信号)。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。