leetcode线程题1117——H2O 生成(两个氢原子结合一个氧原子)

题目要求传送门

这些线程应该三三成组突破屏障并能立即组合产生一个水分子。
你必须保证产生一个水分子所需线程的结合必须发生在下一个水分子产生之前。

换句话说:
如果一个氧线程到达屏障时没有氢线程到达,它必须等候直到两个氢线程到达。
如果一个氢线程到达屏障时没有其它线程到达,它必须等候直到一个氧线程和另一个氢线程到达。
书写满足这些限制条件的氢、氧线程同步代码。

初始化信号量,当h原子有一个的时候就释放h原子的锁,在执行一次h原子线程。

#include<semaphore.h>
class H2O {
    
    
public:
    H2O() {
    
    
        sem_init(&mutex1,0,1);
        sem_init(&mutex2,0,1);
        count = 0;
    }

    void hydrogen(function<void()> releaseHydrogen) {
    
    
        sem_wait(&mutex1);
        count++;
        releaseHydrogen();
        if(count % 2 == 0)
        {
    
      
            sem_post(&mutex2);
        }
        else
        {
    
    
            sem_post(&mutex1);
        }
        // releaseHydrogen() outputs "H". Do not change or remove this line.
        // releaseHydrogen();
    }

    void oxygen(function<void()> releaseOxygen) {
    
    
        sem_wait(&mutex2);
        // releaseOxygen() outputs "O". Do not change or remove this line.
        releaseOxygen();
        sem_post(&mutex1);
    }
    sem_t mutex1;
    sem_t mutex2;
    int count;
};

猜你喜欢

转载自blog.csdn.net/weixin_43786143/article/details/129389005