2

我理解互斥锁的基本原理是保护特定的代码路径不被超过 1 个线程访问。

在我当前的设置中,我有 10 个 A 型线程(A1-A10)和 10 个 B 型线程(B1-B10)。我的意思是,运行无限循环并分别调用方法 A() 和 B() 的线程。从这些方法 A 和 B 中,它们都调用了函数 X()。

我想要做的是,锁定函数 X() 中的代码的某个部分,以便在任何时候从一对 A 和 B (A1:B1, A2:B2 ...) 只有 1 正在访问那个小路。这意味着 A1 位于该代码路径或 B1 中,同样,A2 位于 B2 的代码路径中,依此类推。如果 A1、A2、B3、B4、A5.. 同时访问该代码路径,那很好。只是从 AB 对中只有 1 个线程访问此代码。

我该如何实施?

X() {

// 
Lock this code so that either of (A1, B1) can access it 
and so on..
//
}

4

1 回答 1

1

您正在寻找的是 10 个互斥锁,一个用于 A1/B1,一个用于 A2/B2,等等。您可以将它们放在一个数组中,然后访问正确的一个。

此外,需要明确的是,互斥锁通常不保护代码路径。他们保护的是数据。因此,如果您有一个列表,该列表可能有一个互斥锁,因此一次只有一个线程可以修改列表(并且没有线程访问列表,而另一个线程正在修改它)。如果您有多个列表,则为每个列表提供自己的互斥锁,因此多个线程将同时使用相同的代码路径,但这没关系,因为每个列表都使用不同的列表。从您的描述中听起来,您正在尝试做类似的事情。

于 2020-05-08T19:12:18.130 回答