用户定义的对象的c ++指针是否可以安全地读取?

时间:2013-02-05 17:46:04

标签: c++ multithreading pointers thread-safety

我找不到答案,但这是一个简单的问题:

两个线程在没有锁或任何其他恶作剧的情况下同时读取c ++中用户定义对象的指针值是否安全?

4 个答案:

答案 0 :(得分:7)

是。实际上,同时读取任何值(内置类型)是安全的。

只有在使用某个其他线程同时修改某个值时,才会发生数据争用。标准的主要陈述是:

数据竞赛在§1.10/ 21中定义:

  

如果程序包含两个,则程序的执行包含数据竞争   不同线程中的冲突操作,其中至少有一个不是   原子,并没有发生在另一个之前。

其中冲突在§1.10/ 4中定义:

  

如果其中一个修改内存,则两个表达式评估会发生冲突   位置(1.7),另一个访问或修改相同的内存   位置。

因此,您必须在这些读取和任何写入之间使用适当的同步。

答案 1 :(得分:3)

从多个线程中读取值始终是安全的。只有当您还要写入管理并发访问所需的数据时才会这样做。

只读数据的唯一可能问题是确保在读取完成时该值已经初始化。如果你在开始你的线程之前初始化这个值你会没事的。

答案 2 :(得分:1)

如果变量在其中一个线程中被修改,通常不是线程安全的。

答案 3 :(得分:1)

通过线程安全,我想你的意思是问他们是否有原子写入。在C ++ 03中,这不是真的,因为C ++ 03并不真正了解线程。在C ++ 11中,你有std::atomic,它专门用于指针。