生产者消费者问题c语言代码
时间: 2023-07-31 15:08:41 浏览: 78
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 condp = PTHREAD_COND_INITIALIZER; // 生产者条件变量
pthread_cond_t condc = PTHREAD_COND_INITIALIZER; // 消费者条件变量
void *producer(void *arg) {
int i;
for (i = 0; i < 20; i++) {
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) {
pthread_cond_wait(&condp, &mutex);
}
buffer[count++] = i;
printf("生产者生产: %d\n", i);
pthread_cond_signal(&condc);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
void *consumer(void *arg) {
int i;
for (i = 0; i < 20; i++) {
pthread_mutex_lock(&mutex);
while (count == 0) {
pthread_cond_wait(&condc, &mutex);
}
int data = buffer[--count];
printf("消费者消费: %d\n", data);
pthread_cond_signal(&condp);
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main(int argc, char **argv) {
pthread_t p1, p2, c1, c2;
pthread_create(&p1, NULL, producer, NULL);
pthread_create(&p2, NULL, producer, NULL);
pthread_create(&c1, NULL, consumer, NULL);
pthread_create(&c2, NULL, consumer, NULL);
pthread_join(p1, NULL);
pthread_join(p2, NULL);
pthread_join(c1, NULL);
pthread_join(c2, NULL);
return 0;
}
```
本代码中使用了 `pthread` 库中的互斥锁和条件变量来保护缓冲区并实现生产者消费者模型。两个生产者线程分别向缓冲区中放入数据,两个消费者线程分别从缓冲区中取出数据。当缓冲区元素数量达到上限时,生产者线程会等待消费者线程取出数据;当缓冲区元素数量为零时,消费者线程会等待生产者线程放入数据。在放入或取出数据后,线程会向对应的条件变量发出信号,以唤醒等待的线程。
阅读全文