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

简介: 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;
};
相关文章
LeetCode(多线程)- 1117. H2O 生成
LeetCode(多线程)- 1117. H2O 生成
83 0
|
2月前
|
机器学习/深度学习 算法
力扣刷题日常(一)
力扣刷题日常(一)
20 2
|
2月前
|
存储 索引
《LeetCode》—— LeetCode刷题日记
《LeetCode》—— LeetCode刷题日记
|
2月前
|
搜索推荐
《LeetCode》——LeetCode刷题日记3
《LeetCode》——LeetCode刷题日记3
|
2月前
|
容器
《LeetCode》——LeetCode刷题日记1
《LeetCode》——LeetCode刷题日记1
|
2月前
|
算法
LeetCode刷题---21.合并两个有序链表(双指针)
LeetCode刷题---21.合并两个有序链表(双指针)
|
2月前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
|
2月前
|
算法 测试技术
LeetCode刷题--- 430. 扁平化多级双向链表(深度优先搜索)
LeetCode刷题--- 430. 扁平化多级双向链表(深度优先搜索)
|
2月前
|
存储
实现单链表的基本操作(力扣、牛客刷题的基础&笔试题常客)
实现单链表的基本操作(力扣、牛客刷题的基础&笔试题常客)
144 38
|
9天前
刷题之Leetcode160题(超级详细)
刷题之Leetcode160题(超级详细)
11 0

热门文章

最新文章