进程同步生产者消费者c语言
时间: 2023-07-03 10:22:11 浏览: 147
实现生产者消费者问题
4星 · 用户满意度95%
好的,下面是一个简单的进程同步生产者消费者的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 10 // 缓冲区大小
#define PRODUCE_TIMES 20 // 生产者生产次数
#define CONSUME_TIMES 20 // 消费者消费次数
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t full = PTHREAD_COND_INITIALIZER; // 缓冲区满的条件变量
pthread_cond_t empty = PTHREAD_COND_INITIALIZER; // 缓冲区空的条件变量
int buffer[BUFFER_SIZE]; // 缓冲区
int buffer_index = 0; // 缓冲区当前索引的位置
void *producer(void *arg) {
int i, j, data;
for (i = 0; i < PRODUCE_TIMES; i++) {
data = rand() % 1000; // 生成随机数作为生产者产生的数据
pthread_mutex_lock(&mutex); // 上锁
while (buffer_index == BUFFER_SIZE) { // 缓冲区已满,则等待
pthread_cond_wait(&full, &mutex);
}
buffer[buffer_index++] = data; // 将数据存入缓冲区
printf("producer produced data %d\n", data);
pthread_cond_signal(&empty); // 发出缓冲区非空的信号
pthread_mutex_unlock(&mutex); // 解锁
sleep(rand() % 3); // 生产者休息一段时间
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
int i, j, data;
for (i = 0; i < CONSUME_TIMES; i++) {
pthread_mutex_lock(&mutex); // 上锁
while (buffer_index == 0) { // 缓冲区为空,则等待
pthread_cond_wait(&empty, &mutex);
}
data = buffer[--buffer_index]; // 从缓冲区取出数据
printf("consumer consumed data %d\n", data);
pthread_cond_signal(&full); // 发出缓冲区非满的信号
pthread_mutex_unlock(&mutex); // 解锁
sleep(rand() % 3); // 消费者休息一段时间
}
pthread_exit(NULL);
}
int main() {
pthread_t producer_thread, consumer_thread;
srand(time(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(&mutex); // 销毁互斥锁
pthread_cond_destroy(&full); // 销毁条件变量
pthread_cond_destroy(&empty); // 销毁条件变量
return 0;
}
```
在这个例子中,生产者和消费者共享一个缓冲区,生产者不断地生产数据并将其存入缓冲区,消费者不断地从缓冲区中取出数据进行消费。为了保证生产者和消费者的同步,我们使用了互斥锁和条件变量。
当生产者试图往缓冲区中存入数据时,如果缓冲区已满,则生产者会等待,直到消费者取出数据后缓冲区非满;当消费者试图从缓冲区中取出数据时,如果缓冲区为空,则消费者会等待,直到生产者存入数据后缓冲区非空。这样就保证了生产者和消费者的同步。
阅读全文