Multithreading 如果其他线程无法访问某个线程中的对象,那么在没有锁的情况下更新该对象是否安全?

Multithreading 如果其他线程无法访问某个线程中的对象,那么在没有锁的情况下更新该对象是否安全?,multithreading,c++11,concurrency,locking,Multithreading,C++11,Concurrency,Locking,我有一个实体向量。在更新周期中,我遍历向量并更新每个实体:读取它的位置,计算当前速度,写入更新的位置。此外,在更新过程中,我可以更改程序其他部分中的一些其他对象,但每个仅与当前实体相关的对象和其他实体不会接触该对象 所以,我想在线程中运行这段代码。我将向量分成几个块,并在不同的线程中更新每个块。正如我所看到的,线程是完全独立的。每次迭代中的每个线程都使用独立的内存区域,不会影响其他线程的工作 我这里需要锁吗?我想,在没有互斥的情况下,一切都应该正常工作,等等。我说得对吗?简短回答 不需要,您不需

我有一个实体向量。在更新周期中,我遍历向量并更新每个实体:读取它的位置,计算当前速度,写入更新的位置。此外,在更新过程中,我可以更改程序其他部分中的一些其他对象,但每个仅与当前实体相关的对象和其他实体不会接触该对象

所以,我想在线程中运行这段代码。我将向量分成几个块,并在不同的线程中更新每个块。正如我所看到的,线程是完全独立的。每次迭代中的每个线程都使用独立的内存区域,不会影响其他线程的工作

我这里需要锁吗?我想,在没有互斥的情况下,一切都应该正常工作,等等。我说得对吗?

简短回答 不需要,您不需要任何锁定或同步机制,因为您的问题似乎是一个问题

更长的答案 仅当两个线程可能同时访问同一内存且至少有一个访问是写入操作时才会出现的争用条件。如果您的程序公开了这个特性,那么您需要确保线程以有序的方式访问内存。一种方法是使用锁(但这不是唯一的方法)。否则结果就是UB。 您似乎找到了一种在线程s.t.之间分割工作的方法。每个线程都可以独立于其他线程工作。这是并发编程的最佳情况,因为它不需要任何同步。代码的复杂度大大降低,通常加速比会急剧上升

请注意,正如注释部分所指出的,如果您需要一个线程所做的更改在另一个线程中可见,那么您可能需要某种类型的同步,因为根据内存模型和硬件,在一个线程中所做的更改在另一个线程中可能不会立即可见

这意味着您可能会从
线程1
写入变量,并在一段时间后从
线程2
读取相同的内存,但仍然无法看到
线程1
“我将向量分成几个块,并更新不同线程中的每个块”-在这种情况下,您不需要任何锁定或同步机制,但是,由于错误共享,系统性能可能会显著降低,具体取决于区块如何分配给线程。请注意,编译器可以使用线程专用时态变量消除错误共享

你可以在书和维基上找到大量的信息。这里有一些信息
这里还有一个stackoverflow帖子,内容是“更新线程中的对象”和“我想在线程中运行此代码”。您的代码总是在线程中运行。任何程序可以拥有的最小线程数是1:这是调用
main(…)
的线程。您完全忽略了内存模型。除非对象总是由完全相同的线程处理,否则仍然需要同步,即使一次只有一个线程在处理该对象。同步是当前线程所做更改对其他线程可见的唯一保证。这是正确的,但我认为从我的回答中可以清楚地看出,只要您只从内存中读取,就不需要任何同步。您所说的是变更可见性,这意味着在某个点进行写入操作。我会用你的评论更新答案。谢谢