【发布时间】:2020-06-17 09:13:10
【问题描述】:
如果以前有人问过这个问题,请原谅我。我环顾四周,但我觉得我没有合适的词汇来通过搜索网络找到这个。
我在 python 中有一个多线程应用程序。我希望能够锁定某个代码块,但仅限于具有特定条件的其他线程。我举个例子:有三个线程,thread_a、thread_b和thread_c。每个线程都可以随时运行foo 函数。我不希望任何两个bar 相等的线程能够同时访问Code block ALPHA。但是,我不想阻止 bar 值不同的线程。在这种情况下,假设thread_a 有一个bar == "cat" 并首先点击(3)。在thread_a 命中行(5) 之前,假设thread_b,bar == "cat" 命中行(3)。我想让thread_b 等待。但如果thread_c 和bar == "dog" 一起出现,我希望它能够继续前进。
(1) def foo(bar):
(2)
(3) lock(bar)
(4) # Code block ALPHA (two threads with equivalent bar should not be in here)
(5) unlock(bar)
另外,bar 的可能值是完全不可预测的,但发生冲突的可能性非常高。
感谢您的帮助。我正在查看的库是python threading library
【问题讨论】:
-
bar是有限的吗?如果是,那么您可以设置任意数量的互斥锁,然后锁定与您的线程具有的任何bar值相对应的互斥锁。 -
@numeral,好问题。 Bar 不是有限的,因为您可以为每种可能的情况合理地分配互斥锁。我将更新我的问题以反映这一点。
-
在这种情况下,我唯一能想到的就是您将不得不跟踪您遇到的
bar并动态锁定。我想到的任何东西都涉及某种共享内存模型。这意味着您将必须拥有一个可以锁定所有动态锁的主锁。换句话说,您只有一个可以锁定所有线程的互斥锁。抱歉帮不上忙。 :// -
如果您尝试使用两层锁定系统,请确保您最终不会导致一个线程持有主锁并尝试锁定值锁,而另一个线程持有该值锁并且试图持有主锁。死锁不好玩。
-
@user2357112,您是否知道两层锁定系统的任何好的示例实现。我不想陷入僵局。
标签: python multithreading python-multithreading