我是线程新手。如果我错了,请更正我,因为互斥锁会锁定对共享数据结构的访问权限,以便在解锁之前其他线程不能使用它。因此,我们可以考虑有两个或更多共享数据结构。那么,我应该为不同的数据结构制作不同的互斥对象吗?如果不是,那么std::mutex
将如何知道它应锁定哪个对象?如果我必须同时锁定多个对象?
答案 0 :(得分:2)
您的问题中有几点可以更精确。也许清除它会为你解决问题。
首先,mutex
本身不会锁定对任何内容的访问权限。它基本上是你的代码可以锁定和解锁的东西,还有一些"魔法"确保一次只有一个线程可以锁定它。
如果按惯例,您决定访问某些数据结构foo
的任何代码首先会锁定互斥锁foo_mutex
,然后它会起到保护作用这个数据结构。
所以,就这样说,关于你的问题:
这取决于是否需要一起访问两个数据结构(例如,可以在没有另一个的情况下更新一个数据结构使系统处于不一致状态)。如果是这样,您应该用一个互斥锁来锁定它们。如果没有,您可以使用两个来提高并行性。
互斥锁不会锁定任何内容。按惯例决定是否可以在持有数据结构时访问1,2或100万个数据结构。
答案 1 :(得分:1)
Mutex没有"知道"除了自己以外的任何事情。锁定是在互斥锁本身上执行的。
如果有两个对象(或代码段)需要同步访问(但可以同时访问),那么您可以自由地只使用一个互斥锁,或者每个都使用一个互斥锁。如果使用一个互斥锁,则不会从两个不同的线程同时访问它们。
如果在访问其他对象时无法访问某个对象,则可以使用两个互斥锁,每个互斥锁一个。但是如果在线程已经拥有另一个互斥锁时必须访问一个对象,那么必须注意代码永远不能达到死锁,其中两个线程各自拥有一个互斥锁,并且两个线程同时等待另一个互斥锁被释放。
答案 2 :(得分:0)
如果 总是 需要访问这两个结构,那么它可以被视为单个资源,因此只需要一个锁。
如果您有时甚至只需要一次,就需要独立访问其中一个结构,那么它们就不再被视为单个资源,您可能需要两个锁。当然,单个锁仍然可以,但是那个锁会立即锁定两个资源,禁止其他线程访问任何结构。