我应该为不同的对象使用不同的互斥量吗?

Should I use different mutexes for different objects?

我是线程新手。如果我错了,请纠正我,互斥锁锁定了对共享数据结构的访问,以便其他线程在解锁之前无法使用它。因此,让我们考虑有 2 个或更多共享数据结构。那么,我应该为不同的数据结构创建不同的互斥对象吗?如果不是,那么 std::mutex 如何知道应该锁定哪个对象?如果我必须同时锁定 1 个以上的对象怎么办?

Mutex 不会 "know" 除了自身之外的任何东西。锁定是在互斥量本身上执行的。

如果有两个对象(或代码段)需要同步访问(但可以同时访问),那么您可以自由地为两者使用一个互斥锁,或者为每个使用一个互斥锁。如果您使用一个互斥锁,它们将不会被两个不同的线程同时访问。

如果在访问另一个对象时需要访问一个对象的情况不会发生,那么您可以使用两个互斥体,每个互斥体一个。但是,如果在线程已经持有另一个互斥量的情况下必须访问一个对象,那么必须注意代码永远不会达到死锁,其中两个线程各自持有一个互斥量,并且同时等待另一个互斥量已发布。

你的问题中有几点可以更精确。也许清除它会为您解决问题。

首先,mutex 本身不会锁定对任何内容的访问。它基本上是你的代码可以锁定和解锁的东西,一些 "magic" 确保一次只有一个线程可以锁定它。

如果,按照惯例,您决定任何访问某些数据结构的代码 foo 将首先锁定互斥体 foo_mutex,然后它将起到保护这个数据结构的作用

所以,话虽如此,关于您的问题:

  • 这取决于这两个数据结构是否需要一起访问(例如,可以更新一个而不更新另一个使系统处于不一致状态)。如果是这样,您应该使用单个互斥体锁定它们。如果没有,您可以使用两个来提高并行度。

  • 互斥锁不锁定任何东西。根据惯例,您可以决定是否可以访问 1 个、2 个或 100 万个数据结构,同时持有它。

如果您总是需要访问这两个结构,那么它可以被视为单个资源,因此只需要一个锁。

如果您有时(即使只是一次)需要独立访问其中一个结构,那么它们就不再被视为单一资源,您可能需要两个锁。当然,一个锁可能仍然足够,但是那个锁会同时锁定两个资源,禁止其他线程访问任何结构。