生产者-消费者问题是一个经典的并发编程问题,涉及到多线程或多进程之间的同步与通信。在Linux C环境中,这个问题通常通过使用信号量(semaphore)、互斥锁(mutex)和条件变量(condition variable)来解决。
生产者-消费者问题描述了两个或多个进程/线程之间的协作,其中一个或多个进程/线程(生产者)生成数据,而另一个或多个进程/线程(消费者)消费这些数据。关键在于确保生产者在缓冲区满时停止生产,消费者在缓冲区空时停止消费。
以下是一个简单的单生产者单消费者的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 5
int buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
sem_t empty;
sem_t full;
pthread_mutex_t mutex;
void* producer(void* arg) {
int item, i;
for (i = 0; i < 10; i++) {
item = i;
sem_wait(&empty);
pthread_mutex_lock(&mutex);
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
printf("Produced: %d\n", item);
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
return NULL;
}
void* consumer(void* arg) {
int item, i;
for (i = 0; i < 10; i++) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumed: %d\n", item);
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
return NULL;
}
int main() {
pthread_t producer_thread, consumer_thread;
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, 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);
sem_destroy(&empty);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
问题1:死锁
问题2:竞态条件
问题3:缓冲区溢出/下溢
通过合理使用同步机制和锁,可以有效避免这些问题,确保程序的正确性和稳定性。
领取专属 10元无门槛券
手把手带您无忧上云