LeetCode 多线程 1117. H2O 生成

Posted Alex_996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 多线程 1117. H2O 生成相关的知识,希望对你有一定的参考价值。

1117. H2O 生成

Ideas

虽然题目中给出了多种答案,不过我们可以限制一下各个线程输出的顺序,让输出结果的顺序只能是HHO。

我们可以设置两个信号量,hydrogenSema = Semaphore(2)oxygenSema = Semaphore(1)

先把oxygenSema给锁上,那么此时就只能访问hydrogen线程,访问两次之后,相当于输出了HHhydrogenSema信号量为0了,此时释放一个oxygenSema,那么就会访问oxygen线程,输出一个O,再释放两个hydrogenSema

这样就可以保证这些线程三三成组突破屏障并能立即组合产生一个水分子。

Code

Python

from threading import Semaphore


class H2O:
    def __init__(self):
        self.hydrogenSema = Semaphore(2)
        self.oxygenSema = Semaphore(1)
        self.oxygenSema.acquire()

    def hydrogen(self, releaseHydrogen: 'Callable[[], None]') -> None:
        self.hydrogenSema.acquire()
        releaseHydrogen()
        if self.hydrogenSema._value == 0:
            self.oxygenSema.release()

    def oxygen(self, releaseOxygen: 'Callable[[], None]') -> None:
        self.oxygenSema.acquire()
        releaseOxygen()
        self.hydrogenSema.release()
        self.hydrogenSema.release()

以上是关于LeetCode 多线程 1117. H2O 生成的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode——H2O生成(多线程)

LeetCode 多线程练习2(1116. 打印零与奇偶数 / H2O 生成)

LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口

LeetCode 1117. Building H2O

1117. H2O 生成

1117. H2O 生成