生产者——消费者问题算法C语言代码
时间: 2023-10-30 18:08:48 浏览: 115
生产者消费者问题 进程实现
4星 · 用户满意度95%
下面是一个简单的生产者-消费者问题的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE]; // 缓冲区数组
int counter = 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 val;
while (1) {
val = rand() % 100; // 随机生成数值
pthread_mutex_lock(&mutex);
while (counter == BUFFER_SIZE) // 缓冲区满,等待空闲空间
pthread_cond_wait(&empty, &mutex);
buffer[counter++] = val; // 放入缓冲区
printf("生产者:%d,缓冲区大小:%d\n", val, counter);
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&full); // 发送缓冲区满信号
sleep(1);
}
return NULL;
}
void *consumer(void *arg) {
int val;
while (1) {
pthread_mutex_lock(&mutex);
while (counter == 0) // 缓冲区空,等待生产者
pthread_cond_wait(&full, &mutex);
val = buffer[--counter]; // 从缓冲区取出
printf("消费者:%d,缓冲区大小:%d\n", val, counter);
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&empty); // 发送缓冲区空信号
sleep(1);
}
return NULL;
}
int main(int argc, char *argv[]) {
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;
}
```
在上面的代码中,使用了互斥锁和条件变量来实现线程同步。生产者线程和消费者线程分别使用互斥锁来保护共享变量(缓冲区计数器和缓冲区数组),并使用条件变量来等待对方的信号。当生产者向缓冲区放入数据时,如果缓冲区已满,则会等待消费者取走数据后再放入;当消费者从缓冲区取出数据时,如果缓冲区已空,则会等待生产者放入数据后再取出。这样就保证了生产者和消费者之间的同步和互斥。
阅读全文