在我的Python3.12代码中,我有三个线程,其中第一个线程T1是消费者,第二个线程T2是生产者,第三个线程T3是记录器。有一个共享队列,它是临界区,由 T1 和 T2 访问。我正在使用队列锁。
但是,T2 中的三个附加变量 V1、V2 和 V3 由一个函数操作,这些变量也由 T3 中的另一个函数操作。
因此,我最终在 T2 内处理队列的锁和(不确定)3 个变量的锁。
问题是在这种情况下,就锁的数量及其操作而言,正确的方法是什么?换句话说,我是否需要一个或多个锁来处理 3 个变量?
我尝试过使用一把锁,但没有得到预期的结果。
quamrana 在评论中说,
每个实体有一把锁(您的三个变量可以算作一个实体。)
如何决定,您需要考虑变量之间是否存在某些重要的“关系”。需要更改多个变量的单个线程一次只能更改一个变量。您必须问自己,如果线程 A 在更新某些变量集的过程中被操作系统暂停*,并且线程 B 在 A 暂停时查看这些变量,这会是坏事吗?线程 B 会看到它不应该看到的东西吗?有什么没有意义的事情吗?如果是这样,那么变量集就是 quamrana 所说的那些“实体”之一,并且需要用锁来保护它。 拥有一把锁来保护多个“实体”是可以的。这就是“粗粒度锁定”的本质。如果您不一致地使用锁,则不起作用。我的意思是,假设某个变量
V属于实体E1。任何时候任何线程访问V,你都需要它来锁定L1。如果同一个变量V也是某个other实体的成员,E2,(不是一个好主意,但它发生了),那么你将需要一个锁,L2其他实体,任何时候你做任何可能改变V,的事情,你都需要锁定两个锁。在我的个人看来,如果你达到了这一点,如果你以“粗略”的方式进行,并使用相同的锁保护两个实体,你会更好。
* “被操作系统暂停”是多线程程序中经常发生的事情(单线程程序中也是如此。)