生产者和消费者问题c语言
时间: 2023-11-03 08:05:42 浏览: 185
C语言编程模拟生产者和消费者问题(附代码程序).pdf
5星 · 资源好评率100%
生产者和消费者问题是一个经典的同步问题,可以用来演示多线程的并发操作。在这个问题中,有两个线程:生产者和消费者,它们共享一个缓冲区。生产者往缓冲区中写入数据,而消费者从缓冲区中读取数据。这个问题的难点在于如何保证生产者和消费者之间的同步和互斥,以避免数据竞争和死锁等问题。
下面是一个简单的 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_producer = PTHREAD_COND_INITIALIZER; // 生产者条件变量
pthread_cond_t cond_consumer = PTHREAD_COND_INITIALIZER; // 消费者条件变量
void *producer(void *arg) {
for (int i = 0; i < 100; i++) {
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) {
pthread_cond_wait(&cond_producer, &mutex);
}
buffer[count++] = i;
printf("生产者生产了 %d\n", i);
pthread_cond_signal(&cond_consumer);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
for (int i = 0; i < 100; i++) {
pthread_mutex_lock(&mutex);
while (count == 0) {
pthread_cond_wait(&cond_consumer, &mutex);
}
int data = buffer[--count];
printf("消费者消费了 %d\n", data);
pthread_cond_signal(&cond_producer);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main() {
pthread_t tid_producer, tid_consumer;
pthread_create(&tid_producer, NULL, producer, NULL);
pthread_create(&tid_consumer, NULL, consumer, NULL);
pthread_join(tid_producer, NULL);
pthread_join(tid_consumer, NULL);
return 0;
}
```
在这个实现中,我们使用了互斥锁和条件变量来实现生产者和消费者之间的同步和互斥。当缓冲区已满时,生产者会等待消费者取走数据;当缓冲区为空时,消费者会等待生产者生产数据。同时,我们使用了 `pthread_cond_signal()` 函数来通知等待的线程有新的数据可用。
阅读全文