生产者消费者问题c语言
时间: 2023-05-31 21:06:09 浏览: 191
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 full = PTHREAD_COND_INITIALIZER;
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
void *producer(void *arg)
{
int item;
while (1) {
item = rand() % 100; // 生成一个随机数
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) {
pthread_cond_wait(&empty, &mutex);
}
buffer[count++] = item;
printf("Producer produced item %d\n", item);
pthread_cond_signal(&full);
pthread_mutex_unlock(&mutex);
sleep(1);
}
pthread_exit(NULL);
}
void *consumer(void *arg)
{
int item;
while (1) {
pthread_mutex_lock(&mutex);
while (count == 0) {
pthread_cond_wait(&full, &mutex);
}
item = buffer[--count];
printf("Consumer consumed item %d\n", item);
pthread_cond_signal(&empty);
pthread_mutex_unlock(&mutex);
sleep(1);
}
pthread_exit(NULL);
}
int main()
{
pthread_t tid1, tid2;
srand(time(NULL));
pthread_create(&tid1, NULL, producer, NULL);
pthread_create(&tid2, NULL, consumer, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
```
在这个示例中,我们使用了一个整型数组作为缓冲区,其大小为10。在主函数中,我们创建了两个线程,一个用于生产数据,另一个用于消费数据。生产者和消费者共同使用了一个互斥锁(mutex),以保证缓冲区的访问是互斥的。生产者使用了一个条件变量(full)来等待缓冲区不满,消费者使用了另一个条件变量(empty)来等待缓冲区不空。当生产者向缓冲区中放入一个数据时,它会发送一个full信号,通知消费者缓冲区中有数据可用。当消费者从缓冲区中取出一个数据时,它会发送一个empty信号,通知生产者缓冲区中有空间可用。
在生产者和消费者的代码中,我们使用了while循环来检查条件是否满足。如果条件不满足,线程会调用pthread_cond_wait函数来等待条件变量。当条件满足时,线程会被唤醒,并继续执行。注意,在等待条件变量之前,线程必须先获得互斥锁,以避免竞争条件。在发送信号之前,线程必须先释放互斥锁,以允许其他线程访问共享资源。
阅读全文