0
点赞
收藏
分享

微信扫一扫

LeetCode 多线程 1117. H2O 生成


​​1117. H2O 生成​​

Ideas

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

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

先把​​oxygenSema​​​给锁上,那么此时就只能访问​hydrogen​​​线程,访问两次之后,相当于输出了​​HH​​​,​​hydrogenSema​​​信号量为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()


举报

相关推荐

0 条评论