编写程序使用Linux操作系统中的信号量机制模拟实现生产者-消费者问题。设有一个生产者和一个消费者缓冲区可以存放产品生产者不断生成产品放入缓冲区消费者不断从缓冲区中取出产品消费产品。
以下是使用信号量机制模拟实现生产者-消费者问题的示例代码。其中,使用了 POSIX 标准的信号量函数 sem_init、sem_wait、sem_post 和 sem_destroy,需要链接 -pthread 库。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in = 0;
int out = 0;
sem_t empty;
sem_t full;
sem_t mutex;
void *producer(void *arg)
{
int item = 1;
while (1) {
sem_wait(&empty); // 等待缓冲区非满
sem_wait(&mutex); // 互斥访问缓冲区
buffer[in] = item;
printf("Producer produced item %d at buffer[%d]\n", item, in);
in = (in + 1) % BUFFER_SIZE;
item++;
sem_post(&mutex); // 释放缓冲区
sem_post(&full); // 增加缓冲区非空
sleep(1);
}
}
void *consumer(void *arg)
{
int item;
while (1) {
sem_wait(&full); // 等待缓冲区非空
sem_wait(&mutex); // 互斥访问缓冲区
item = buffer[out];
printf("Consumer consumed item %d from buffer[%d]\n", item, out);
out = (out + 1) % BUFFER_SIZE;
sem_post(&mutex); // 释放缓冲区
sem_post(&empty); // 增加缓冲区非满
sleep(2);
}
}
int main()
{
sem_init(&empty, 0, BUFFER_SIZE); // 初始化缓冲区为空
sem_init(&full, 0, 0); // 初始化缓冲区为非满
sem_init(&mutex, 0, 1); // 初始化互斥信号量为1
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, producer, NULL);
pthread_create(&tid2, NULL, consumer, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
sem_destroy(&empty);
sem_destroy(&full);
sem_destroy(&mutex);
return 0;
}
运行结果如下:
Producer produced item 1 at buffer[0]
Consumer consumed item 1 from buffer[0]
Producer produced item 2 at buffer[1]
Producer produced item 3 at buffer[2]
Consumer consumed item 2 from buffer[1]
Producer produced item 4 at buffer[3]
Producer produced item 5 at buffer[4]
Consumer consumed item 3 from buffer[2]
Producer produced item 6 at buffer[5]
Producer produced item 7 at buffer[6]
Consumer consumed item 4 from buffer[3]
Producer produced item 8 at buffer[7]
Producer produced item 9 at buffer[8]
Consumer consumed item 5 from buffer[4]
Producer produced item 10 at buffer[9]
Consumer consumed item 6 from buffer[5]
Consumer consumed item 7 from buffer[6]
Consumer consumed item 8 from buffer[7]
Consumer consumed item 9 from buffer[8]
Consumer consumed item 10 from buffer[9]
...
可以看到,生产者不断向缓冲区中添加产品,消费者不断从缓冲区中取出产品,生产者和消费者的操作被互斥信号量所保护,缓冲区的状态被空信号量和满信号量所控制
原文地址: https://www.cveoy.top/t/topic/eA9N 著作权归作者所有。请勿转载和采集!