我找不到答案,但这是一个简单的问题:
两个线程在没有锁或任何其他恶作剧的情况下同时读取c ++中用户定义对象的指针值是否安全?
答案 0 :(得分:7)
是。实际上,同时读取任何值(内置类型)是安全的。
只有在使用某个其他线程同时修改某个值时,才会发生数据争用。标准的主要陈述是:
数据竞赛在§1.10/ 21中定义:
如果程序包含两个,则程序的执行包含数据竞争 不同线程中的冲突操作,其中至少有一个不是 原子,并没有发生在另一个之前。
其中冲突在§1.10/ 4中定义:
如果其中一个修改内存,则两个表达式评估会发生冲突 位置(1.7),另一个访问或修改相同的内存 位置。
因此,您必须在这些读取和任何写入之间使用适当的同步。
答案 1 :(得分:3)
从多个线程中读取值始终是安全的。只有当您还要写入管理并发访问所需的数据时才会这样做。
只读数据的唯一可能问题是确保在读取完成时该值已经初始化。如果你在开始你的线程之前初始化这个值你会没事的。
答案 2 :(得分:1)
如果变量在其中一个线程中被修改,通常不是线程安全的。
答案 3 :(得分:1)
通过线程安全,我想你的意思是问他们是否有原子写入。在C ++ 03中,这不是真的,因为C ++ 03并不真正了解线程。在C ++ 11中,你有std::atomic,它专门用于指针。