用c语言实现生产者消费者问题
时间: 2023-10-24 11:05:54 浏览: 319
生产者消费者问题是一个经典的多线程同步问题,下面是用 C 语言实现的一个简单的生产者消费者问题解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 10 // 缓冲区大小
#define THREAD_NUM 2 // 线程数
int buffer[BUFFER_SIZE]; // 缓冲区
int count = 0; // 缓冲区中的元素个数
int in = 0; // 待插入元素的位置
int out = 0; // 待取出元素的位置
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t not_full = PTHREAD_COND_INITIALIZER; // 缓冲区不满条件变量
pthread_cond_t not_empty = PTHREAD_COND_INITIALIZER; // 缓冲区不空条件变量
void *producer(void *arg) {
int i;
for (i = 0; i < BUFFER_SIZE * 2; i++) {
pthread_mutex_lock(&mutex); // 加锁
while (count == BUFFER_SIZE) { // 缓冲区满了,等待不满条件
pthread_cond_wait(¬_full, &mutex);
}
buffer[in] = i; // 往缓冲区插入元素
in = (in + 1) % BUFFER_SIZE;
count++;
printf("producer: insert %d\n", i);
pthread_cond_signal(¬_empty); // 发送不空条件信号
pthread_mutex_unlock(&mutex); // 解锁
}
return NULL;
}
void *consumer(void *arg) {
int i, data;
for (i = 0; i < BUFFER_SIZE * 2; i++) {
pthread_mutex_lock(&mutex); // 加锁
while (count == 0) { // 缓冲区空了,等待不空条件
pthread_cond_wait(¬_empty, &mutex);
}
data = buffer[out]; // 从缓冲区取出元素
out = (out + 1) % BUFFER_SIZE;
count--;
printf("consumer: take out %d\n", data);
pthread_cond_signal(¬_full); // 发送不满条件信号
pthread_mutex_unlock(&mutex); // 解锁
}
return NULL;
}
int main() {
pthread_t threads[THREAD_NUM];
int i;
// 创建生产者线程和消费者线程
pthread_create(&threads[0], NULL, producer, NULL);
pthread_create(&threads[1], NULL, consumer, NULL);
// 等待线程执行完毕
for (i = 0; i < THREAD_NUM; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
```
上述代码中创建了两个线程,一个生产者线程和一个消费者线程。生产者线程往缓冲区中插入元素,消费者线程从缓冲区中取出元素。当缓冲区满了时,生产者线程等待不满条件变量;当缓冲区空了时,消费者线程等待不空条件变量。每次插入或取出元素后,都需要发送相应的条件信号。这样,在多线程并发执行时,可以保证缓冲区的正确性和线程之间的同步。
阅读全文
相关推荐
![c](https://img-home.csdnimg.cn/images/20250102104920.png)
![c](https://img-home.csdnimg.cn/images/20250102104920.png)
![c](https://img-home.csdnimg.cn/images/20250102104920.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)