用c语言实现编程实现生产者消费者问题
时间: 2023-10-23 17:08:28 浏览: 211
好的,下面是一个使用 C 语言实现生产者消费者问题的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE]; // 缓冲区
int in = 0, out = 0; // 生产者和消费者在缓冲区中的位置
int count = 0; // 缓冲区中元素的数量
pthread_mutex_t mutex; // 互斥锁
pthread_cond_t full, empty; // 条件变量
// 生产者函数
void *producer(void *arg) {
int item;
while (1) {
item = rand() % 1000;
pthread_mutex_lock(&mutex);
// 如果缓冲区已满,等待消费者消费
while (count == BUFFER_SIZE) {
pthread_cond_wait(&empty, &mutex);
}
buffer[in] = item;
printf("Producer put item %d into the buffer.\n", item);
in = (in + 1) % BUFFER_SIZE;
count++;
// 唤醒消费者
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[out];
printf("Consumer get item %d from the buffer.\n", item);
out = (out + 1) % BUFFER_SIZE;
count--;
// 唤醒生产者
pthread_cond_signal(&empty);
pthread_mutex_unlock(&mutex);
sleep(1);
}
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
pthread_t tid_producer, tid_consumer;
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&full, NULL);
pthread_cond_init(&empty, NULL);
pthread_create(&tid_producer, NULL, producer, NULL);
pthread_create(&tid_consumer, NULL, consumer, NULL);
pthread_join(tid_producer, NULL);
pthread_join(tid_consumer, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&full);
pthread_cond_destroy(&empty);
return 0;
}
```
这个程序中使用了 pthread 库来实现线程和互斥锁,使用了条件变量来实现生产者和消费者之间的同步。缓冲区大小为 10,生产者和消费者每隔 1 秒向其中添加或取出一个元素。在生产者向缓冲区中添加元素时,如果缓冲区已满,则等待消费者消费;在消费者从缓冲区中取出元素时,如果缓冲区为空,则等待生产者生产。程序中还使用了 sleep 函数来模拟生产和消费的时间间隔。
阅读全文