繁体   English   中英

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

[英]Should I use different mutexes for different objects?

我是线程新手。 如果我错了,请更正我,因为互斥锁会锁定对共享数据结构的访问权限,以便在解锁之前其他线程不能使用它。 因此,我们可以考虑有两个或更多共享数据结构。 那么,我应该为不同的数据结构制作不同的互斥对象吗? 如果不是,那么std::mutex将如何知道它应该锁定哪个对象? 如果我必须同时锁定多个对象?

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

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

按照惯例 ,如果您决定访问某些数据结构foo任何代码首先通过锁定互斥锁foo_mutex开始,那么它将具有保护此数据结构的效果。

所以,就这样说,关于你的问题:

  • 这取决于是否需要一起访问两个数据结构(例如,可以在没有另一个的情况下更新一个数据结构使系统处于不一致状态)。 如果是这样,您应该用一个互斥锁来锁定它们。 如果没有,您可以使用两个来改善并行性。

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

Mutex并不“了解”除了自身以外的任何东西。 锁定在互斥锁本身上执行。

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

如果在访问其他对象时无法访问某个对象,则可以使用两个互斥锁,每个互斥锁一个。 但是如果在线程已经拥有另一个互斥锁时必须访问一个对象,那么必须注意代码永远不能达到死锁,其中两个线程各自拥有一个互斥锁,并且两个线程同时等待另一个互斥锁被释放。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM