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;
};
相关文章
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
6月前
Leetcode之多线程编程题
现有函数 printNumber 可以用一个整数参数调用,并输出该整数到控制台。 例如,调用 printNumber(7) 将会输出 7 到控制台。 给你类 ZeroEvenOdd 的一个实例,该类中有三个函数:zero、even 和 odd 。ZeroEvenOdd 的相同实例将会传递给三个不同线程:
101 1
|
数据采集
LeetCode(多线程)- 1242. 多线程网页爬虫
LeetCode(多线程)- 1242. 多线程网页爬虫
222 0
|
调度
leetcode.1114-按序打印-多线程案例
leetcode.1114-按序打印-多线程案例
107 0
leetcode线程题1116——打印零与奇偶数
leetcode线程题1116——打印零与奇偶数
101 0
|
调度
leetcode 线程题 1114. 按序打印
leetcode 线程题 1114. 按序打印
LeetCode(多线程)- 题集
LeetCode(多线程)- 题集
107 0
LeetCode(多线程)- 题集
|
C语言 C++
【LeetCode1114】按序打印(多线程,信号量)
第一次在leetcode上做这种多线程题目,对于这种“同步”问题,需要明白线程在哪里需要阻塞(对应PV操作中的P),再找对应的V部分(释放资源)。并且题目这里不要求考察临界资源的访问(互斥关系),只需要考虑同步关系。先想的printB之前需要阻塞,因为需要等A完成打印,所
155 0
【LeetCode1114】按序打印(多线程,信号量)
LeetCode(多线程)- 1279. 红绿灯路口
LeetCode(多线程)- 1279. 红绿灯路口
333 0
LeetCode(多线程)- 1226. 哲学家进餐
LeetCode(多线程)- 1226. 哲学家进餐
107 0