在c++中,两个线程/对象在一个对象集合中可以安全地做什么?



因此,在我开始处理应该与集合....中的多个对象交互的多线程程序之前我想对所涉及的概念有一个清楚的了解。

我主要关心的是死锁之类的东西。

假设我有一个对象的集合,定义如下…

vector<MyObjects> m_objects;

想象它被100-500个对象填充。现在想象一下,这些对象中的每一个都需要能够在某个时刻与所有其他对象进行通信。在英语中,它们需要能够安全地读取和写入所有其他对象…

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

如果有人有一些关于这个主题的容易理解的文章/读物,我很乐意深入研究一下…

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

最安全的解决方案是锁定整个vector,这样一次只有一个线程可以修改vector及其包含的对象。然而,问题是,如果在多线程中仍然有一个点,那么…

试图用自己的锁来保护vector中的每个对象很容易导致循环依赖,这是潜在的危险。

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

Boxer1试图撞击Boxer2。如果重击的影响取决于Boxer1当前的生命值水平,那么您必须首先锁定Boxer1,因为您不希望任何人在执行重击操作时改变他的生命值。同时,你必须锁定Boxer2,因为你不希望任何人在Boxer1出拳时增加他的生命值(也许Boxer1会击倒Boxer2)。

现在,如果Boxer2试图同时击中Boxer2,你也会先锁定Boxer2,然后再锁定Boxer1。

所以如果两个线程对你的拳击手执行操作,同时锁定了自己的拳击手,他们将永远等待锁定另一个拳击手,你会死锁。

为了防止这种死锁,您必须设计出某种锁层次结构。

最新更新