1117. H2O 生成
Ideas虽然题目中给出了多种答案,不过我们可以限制一下各个线程输出的顺序,让输出结果的顺序只能是HHO。
我们可以设置两个信号量,hydrogenSema = Semaphore(2)和oxygenSema = Semaphore(1)。
先把oxygenSema给锁上,那么此时就只能访问hydrogen线程,访问两次之后,相当于输出了HH,hydrogenSema信号量为0了,此时释放一个oxygenSema,那么就会访问oxygen线程,输出一个O,再释放两个hydrogenSema。
这样就可以保证这些线程三三成组突破屏障并能立即组合产生一个水分子。
Code Pythonfrom 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()