liunx实现生产者消费者问题
时间: 2023-08-25 13:07:58 浏览: 44
生产者消费者问题是一个经典的同步问题,其基本思想是维护一个缓冲区,生产者往缓冲区中放入数据,消费者从缓冲区中取出数据。如果缓冲区已满,生产者需要等待,直到缓冲区有空闲位置;如果缓冲区已空,消费者需要等待,直到缓冲区有数据可取。
在 Linux 中,可以使用线程和信号量来实现生产者消费者问题。下面是一个简单的实现:
```c
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int count = 0;
int in = 0;
int out = 0;
sem_t empty; // 空闲位置数
sem_t full; // 已占用位置数
pthread_mutex_t mutex; // 互斥锁
void *producer(void *arg)
{
int item;
while (1) {
item = rand() % 100; // 生产一个随机数
sem_wait(&empty); // 等待空闲位置
pthread_mutex_lock(&mutex); // 加锁
buffer[in] = item; // 放入缓冲区
in = (in + 1) % BUFFER_SIZE;
count++;
printf("Producer produced item %d\n", item);
pthread_mutex_unlock(&mutex); // 解锁
sem_post(&full); // 释放已占用位置
sleep(1); // 等待一段时间
}
}
void *consumer(void *arg)
{
int item;
while (1) {
sem_wait(&full); // 等待已占用位置
pthread_mutex_lock(&mutex); // 加锁
item = buffer[out]; // 从缓冲区取出数据
out = (out + 1) % BUFFER_SIZE;
count--;
printf("Consumer consumed item %d\n", item);
pthread_mutex_unlock(&mutex); // 解锁
sem_post(&empty); // 释放空闲位置
sleep(1); // 等待一段时间
}
}
int main()
{
pthread_t tid_producer, tid_consumer;
// 初始化信号量和互斥锁
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, 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);
// 销毁信号量和互斥锁
sem_destroy(&empty);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
```
在这个程序中,生产者和消费者线程分别执行 `producer` 和 `consumer` 函数。生产者每次生成一个随机数并放入缓冲区,消费者每次从缓冲区取出一个数据并输出。整个过程中,使用信号量和互斥锁来保证缓冲区的同步和互斥访问。