C++ 在C+;中,两个线程/对象在对象集合中可以安全地执行什么操作+;?

C++ 在C+;中,两个线程/对象在对象集合中可以安全地执行什么操作+;?,c++,multithreading,C++,Multithreading,因此,在我开始研究一个多线程程序之前,它应该与集合中的多个对象进行交互。。。。我想对涉及的概念有一个清晰的了解 我主要关心的是死锁之类的事情 假设我有一个这样定义的对象集合 vector<MyObjects> m_objects; 向量m_对象; 想象一下,它被100-500个对象填充。 现在想象一下,这些对象中的每一个都需要在某个时刻能够与所有其他对象通信。在英语中,他们需要能够安全地读写所有其他对象 我知道为了写入一个对象,它需要被锁定。。。但是,一个对象是否可以在没有额外功

因此,在我开始研究一个多线程程序之前,它应该与集合中的多个对象进行交互。。。。我想对涉及的概念有一个清晰的了解

我主要关心的是死锁之类的事情

假设我有一个这样定义的对象集合

vector<MyObjects> m_objects;
向量m_对象;
想象一下,它被100-500个对象填充。 现在想象一下,这些对象中的每一个都需要在某个时刻能够与所有其他对象通信。在英语中,他们需要能够安全地读写所有其他对象

我知道为了写入一个对象,它需要被锁定。。。但是,一个对象是否可以在没有额外功能的情况下安全地读取另一个对象?如果是,对象能否从正在写入的锁定对象中读取?(我对最后一个问题的第一个猜测是否定的,因为那没有意义)


如果有人在这个主题上有一些易于理解的文章/读物,我想深入探讨一下…

你必须在一个对象中锁定共享资源。每个对象都应该保持其打开状态,如果该状态不是系统共享资源的一部分,则不需要锁定它们。

最安全的解决方案是锁定整个向量,这样一次只有一个线程可以修改向量及其包含的对象。然而,问题是,如果多线程仍然有意义的话

试图用自己的锁来保护向量中的每个对象很容易导致循环依赖,并且有潜在的危险

想象一下下面的场景,使用上面评论中的拳击手比喻:

拳击手1试图打拳击手2。如果打孔的影响取决于Boxer1的当前健康水平,则必须首先锁定Boxer1,因为您不希望任何人在执行打孔操作时更改其健康状况。同时,你必须锁定Boxer2,因为你不希望任何人在Boxer1的拳击中增加他的健康(也许Boxer1会击倒Boxer2…)

现在,如果Boxer2尝试攻击Boxer2同时尝试攻击Boxer1,您也会先锁定Boxer2,然后锁定Boxer1

因此,如果对您的boxer执行操作的两个线程都同时锁定了自己的boxer,那么它们将永远等待锁定另一个boxer,您将陷入死锁


为了防止这种死锁,您必须制定某种锁定层次结构

我不知道你想要什么。“现在想象一下……其他目标在某个时刻”。。。还有什么别的东西?向量中的其他对象?是的,向量中的其他对象。问题是-向量会改变吗。若向量不变,则不需要保护向量本身。通常,多次读取是安全的,读/写和多次写入是不安全的。还存在“虚假共享”问题,即对象可以在缓存中彼此靠近,从而导致不必要的缓存抖动。好的,向量本身可以修改吗?它是否会变大,项目是否可以在运行时删除,等等。向量的内容会不断变化,向量中的对象的添加和删除也会不断发生。