请写一段c语言代码实现生产者消费者问题
时间: 2024-05-08 12:19:08 浏览: 97
C语言实现生产者消费者问题
下面是一段简单的 C 代码实现生产者消费者问题:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 10 // 缓冲区大小
int buffer[BUFFER_SIZE]; // 缓冲区数组
pthread_mutex_t mutex; // 互斥锁
pthread_cond_t cond_full; // 缓冲区已满条件变量
pthread_cond_t cond_empty; // 缓冲区已空条件变量
int in = 0; // 生产者进入缓冲区的位置
int out = 0; // 消费者从缓冲区取出的位置
void *producer(void *arg)
{
int item, i;
for (i = 0; i < BUFFER_SIZE; i++) {
// 生成数据项
item = rand();
pthread_mutex_lock(&mutex);
while ((in + 1) % BUFFER_SIZE == out) { // 缓冲区已满
pthread_cond_wait(&cond_full, &mutex);
}
buffer[in] = item; // 将数据项放入缓冲区
in = (in + 1) % BUFFER_SIZE; // 生产者进入缓冲区的位置+1
pthread_cond_signal(&cond_empty); // 唤醒一个等待的消费者线程
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void *consumer(void *arg)
{
int item, i;
for (i = 0; i < BUFFER_SIZE; i++) {
pthread_mutex_lock(&mutex);
while (in == out) { // 缓冲区已空
pthread_cond_wait(&cond_empty, &mutex);
}
item = buffer[out]; // 取出数据项
out = (out + 1) % BUFFER_SIZE; // 消费者从缓冲区取出的位置+1
printf("Consumer get item %d\n", item); // 消费数据项
pthread_cond_signal(&cond_full); // 唤醒一个等待的生产者线程
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main()
{
pthread_t tid1, tid2;
int ret;
// 初始化互斥锁和条件变量
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond_full, NULL);
pthread_cond_init(&cond_empty, NULL);
// 创建生产者线程和消费者线程
ret = pthread_create(&tid1, NULL, producer, NULL);
if (ret != 0) {
printf("Create producer thread error!\n");
return -1;
}
ret = pthread_create(&tid2, NULL, consumer, NULL);
if (ret != 0) {
printf("Create consumer thread error!\n");
return -1;
}
// 等待生产者线程和消费者线程结束
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
// 销毁互斥锁和条件变量
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond_full);
pthread_cond_destroy(&cond_empty);
return 0;
}
```
阅读全文