我有两段代码:
section_a
# some code
section_b
只有在执行 section_b 时才需要阻止 section_a 。如果 section_b 中没有阻止,则 section_a 可由多个线程执行。
当 section_b 开始执行时,我需要向其他线程发送信号,不要进入 section_a (在此之前等待)。当最后一个帖子离开 section_a 时,必须执行 section_b 。
如果我使用条件锁定(threading.Condition.acquire(),threading.Condition.release())来解决问题我很困惑如何让许多人进入 section_a 线程同时。当我们在 section_a 之前调用condition.acquire()时,其他线程也会被阻止进入该部分。
while True:
condition.acquire() # other threads that would enter point_a can't do that after this acquire()
#section_a, point_a
condition.release()
# another place of a program
while True:
condition.acquire() # I'd like threads can't enter section_a after this acquire, but not after acquire before point_a
#section_b
condition.release()
如果 section_a 由任何线程执行,我需要阻止 section_b 。
你能告诉我正确的结构吗?
请原谅,我没有多线程经验。可能还有另一种结构。
答案 0 :(得分:1)
您可以使用threading2中的SHLock
(共享锁定),这似乎完全符合您的要求。
acquire
方法接受shared
参数,如果它以true
传入,您将以共享模式锁定它,如果它以false
传入,你将把它锁定在专属模式。
在您的示例中,您在输入section_a时会以共享模式调用acquire
,这会让任意数量的线程进入section_a。当您输入section_b时,您将锁定独占模式,这将阻止任何同时共享模式锁定(即任何人在您持有锁定的同时进入section_a)