C语言实现进程同步的消费者与生产者问题
时间: 2023-06-14 11:08:27 浏览: 139
消费者和生产者问题是进程同步中的经典问题,它描述了多个进程同时访问共享缓冲区时可能出现的竞争条件和死锁问题。在该问题中,生产者进程将数据放入缓冲区,而消费者进程从缓冲区中取出数据。为了避免竞争条件和死锁问题,需要使用同步机制,如信号量或互斥锁等来保证进程之间的互斥访问。
下面是一个实现消费者和生产者问题的示例代码,使用了互斥锁和条件变量来实现同步:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int count = 0;
pthread_mutex_t lock;
pthread_cond_t full;
pthread_cond_t empty;
void *producer(void *arg) {
int i;
for (i = 0; i < 20; i++) {
pthread_mutex_lock(&lock);
while (count == BUFFER_SIZE) {
pthread_cond_wait(&empty, &lock);
}
buffer[count++] = i;
printf("Produced %d\n", i);
pthread_cond_signal(&full);
pthread_mutex_unlock(&lock);
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
int i;
for (i = 0; i < 20; i++) {
pthread_mutex_lock(&lock);
while (count == 0) {
pthread_cond_wait(&full, &lock);
}
int consumed = buffer[--count];
printf("Consumed %d\n", consumed);
pthread_cond_signal(&empty);
pthread_mutex_unlock(&lock);
}
pthread_exit(NULL);
}
int main() {
pthread_t producer_thread, consumer_thread;
pthread_mutex_init(&lock, NULL);
pthread_cond_init(&full, NULL);
pthread_cond_init(&empty, 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(&lock);
pthread_cond_destroy(&full);
pthread_cond_destroy(&empty);
return 0;
}
```
在该示例中,生产者线程通过循环向缓冲区中添加数据,并通过条件变量 `full` 来通知消费者线程,缓冲区已经有数据可供消费。消费者线程也通过循环从缓冲区中取出数据,并通过条件变量 `empty` 来通知生产者线程,缓冲区已经有空闲位置可以添加数据。在添加和取出数据时,使用互斥锁 `lock` 来保证进程之间的互斥访问。
阅读全文