编写程序, 使用Linux操作系统中的信号量机制模拟 实现生产者-消费者问题。设有一个生产者可以生产 水果并放入缓冲区(最多只能放10个水果) ,有一 个消费者, 不断从缓冲区中取出水果,并吃掉水 果

编写程序, 使用Linux操作系统中的信号量机制模拟 实现生产者-消费者问题。设有一个生产者可以生产 水果并放入缓冲区(最多只能放10个水果) ,有一 个消费者, 不断从缓冲区中取出水果,并吃掉水 果。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

#define BUFFER_SIZE 10

typedef struct {
    sem_t empty;  //缓冲区为空的信号量
    sem_t full;   //缓冲区为满的信号量
    sem_t mutex;  //互斥信号量,用于保护缓冲区
    int buffer[BUFFER_SIZE]; //缓冲区
    int in;       //生产者的下标
    int out;      //消费者的下标
} buffer_t;

void *producer(void *arg) {
    buffer_t *buffer = (buffer_t *)arg;

    while (1) {
        // 生产水果
        int fruit = rand() % 100;

        // 如果缓冲区已满,等待空闲位置
        sem_wait(&buffer->empty);

        // 保护缓冲区
        sem_wait(&buffer->mutex);

        // 将水果放入缓冲区
        buffer->buffer[buffer->in] = fruit;
        printf("Produced fruit: %d\n", fruit);
        buffer->in = (buffer->in + 1) % BUFFER_SIZE;

        // 释放缓冲区的互斥锁
        sem_post(&buffer->mutex);

        // 发送满缓冲区信号
        sem_post(&buffer->full);
    }
}

void *consumer(void *arg) {
    buffer_t *buffer = (buffer_t *)arg;

    while (1) {
        // 如果缓冲区为空,等待水果生产完成
        sem_wait(&buffer->full);

        // 保护缓冲区
        sem_wait(&buffer->mutex);

        // 取出缓冲区中的水果
        int fruit = buffer->buffer[buffer->out];
        printf("Consumed fruit: %d\n", fruit);
        buffer->out = (buffer->out + 1) % BUFFER_SIZE;

        // 释放缓冲区的互斥锁
        sem_post(&buffer->mutex);

        // 发送缓冲区空信号
        sem_post(&buffer->empty);
    }
}

int main(int argc, char *argv[]) {
    buffer_t buffer;
    pthread_t producer_thread, consumer_thread;

    // 初始化信号量
    sem_init(&buffer.empty, 0, BUFFER_SIZE);
    sem_init(&buffer.full, 0, 0);
    sem_init(&buffer.mutex, 0, 1);

    // 初始化下标
    buffer.in = 0;
    buffer.out = 0;

    // 创建生产者和消费者线程
    pthread_create(&producer_thread, NULL, producer, &buffer);
    pthread_create(&consumer_thread, NULL, consumer, &buffer);

    // 等待线程结束
    pthread_join(producer_thread, NULL);
    pthread_join(consumer_thread, NULL);

    // 销毁信号量
    sem_destroy(&buffer.empty);
    sem_destroy(&buffer.full);
    sem_destroy(&buffer.mutex);

    return 0;
}

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值