力扣1117. H2O 生成(信号量)

力扣1117. H2O 生成(信号量)

https://leetcode-cn.com/problems/building-h2o/

信号量

关键在于H和O如何互相等待互相通知,利用信号量可以解决,代码如下。

#include <semaphore.h>
class H2O {
public:
    sem_t hjob;
    sem_t ojob;
    sem_t hlimit;
    sem_t olimit;
    H2O() {
        sem_init(&hjob,0,0);// H 反应条件信号量
        sem_init(&ojob,0,0);// O 反应条件信号量
        sem_init(&hlimit,0,2);// H线程信号量
        sem_init(&olimit,0,1);// O线程信号量
    }

    void hydrogen(function<void()> releaseHydrogen) {
        sem_wait(&hlimit);// 保证只有2个H线程进入执行
        sem_post(&hjob);// 释放H原子到达信号
        sem_wait(&ojob);// 等待O原子到达
        // releaseHydrogen() outputs "H". Do not change or remove this line.
        releaseHydrogen();        
        sem_post(&hlimit);// 相当于唤醒1个H线程
    }

    void oxygen(function<void()> releaseOxygen) {
        sem_wait(&olimit);// 保证只有1个O线程进入执行
        sem_post(&ojob);// 释放O原子到达信号,因为有2个H线程等待所以释放2个
        sem_post(&ojob);
        sem_wait(&hjob);// 等待H原子到达,2个原因同上
        sem_wait(&hjob);
        // releaseOxygen() outputs "O". Do not change or remove this line.
        releaseOxygen();
        sem_post(&olimit);// 相当于唤醒1个O线程
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值