Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该为不同的对象使用不同的互斥体吗?_C++_Multithreading_Mutex - Fatal编程技术网

C++ 我应该为不同的对象使用不同的互斥体吗?

C++ 我应该为不同的对象使用不同的互斥体吗?,c++,multithreading,mutex,C++,Multithreading,Mutex,我不熟悉穿线。如果我错误地认为互斥锁锁定了对共享数据结构的访问,从而使它在解锁之前不能被其他线程使用,请纠正我的错误。因此,让我们考虑有2个或更多共享数据结构。那么,我应该为不同的数据结构创建不同的互斥对象吗?如果没有,那么std::mutex如何知道应该锁定哪个对象?如果我必须同时锁定多个对象,该怎么办 互斥体除了自身之外不“知道”任何东西。锁是在互斥锁本身上执行的 如果有两个对象(或代码段)需要同步访问(但可以同时访问),那么您可以自由地为这两个对象使用一个互斥,或者为每个对象使用一个互斥。

我不熟悉穿线。如果我错误地认为互斥锁锁定了对共享数据结构的访问,从而使它在解锁之前不能被其他线程使用,请纠正我的错误。因此,让我们考虑有2个或更多共享数据结构。那么,我应该为不同的数据结构创建不同的互斥对象吗?如果没有,那么
std::mutex
如何知道应该锁定哪个对象?如果我必须同时锁定多个对象,该怎么办

互斥体除了自身之外不“知道”任何东西。锁是在互斥锁本身上执行的

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


如果在访问另一个对象时不能要求访问一个对象,那么可以使用两个互斥体,每个互斥体一个。但是,如果一个对象可能在线程已经拥有另一个互斥体的情况下被访问,那么必须注意,代码永远不会出现死锁,即两个线程各自拥有一个互斥体,并且两个线程同时等待另一个互斥体被释放。

您的问题中有几点可以更精确地说明。也许清除这些会为你解决问题

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

如果按照惯例,您决定任何访问某个数据结构的代码首先锁定一个互斥对象,那么它将具有保护此数据结构的效果

话虽如此,关于你的问题:

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

  • 互斥锁不锁定任何内容。按照惯例,您可以在持有数据结构的同时访问1、2或100万个数据结构,这是由您自己决定的

如果您总是需要访问这两个结构,则可以将其视为单个资源,因此只需要一个锁


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

a
std::mutex
本身不会锁定任何数据结构。阅读什么是互斥锁,并查看
std::mutex
的文档。有些系统(例如Python解释器IIRC)对每个共享资源使用一个全局锁。事实上,您很少真正需要多个锁才能正确执行。当然,使用更多的锁可以利用并发性better@HannoBinder是的,刚刚加了一句话。