4

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

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

4

4 回答 4

8

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

只有当某个值与使用它的其他线程同时修改时,才会发生数据竞争。标准中对此的关键声明是:

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

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

§1.10 /4 中定义了冲突:

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

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

于 2013-02-05T17:56:24.117 回答
3

从多个线程读取值总是安全的。只有当您还写入需要管理并发访问的数据时。

只读数据的唯一可能问题是确保在读取完成时该值实际上已被初始化。如果您在启动线程之前初始化该值,您会没事的。

于 2013-02-05T17:52:13.173 回答
1

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

于 2013-02-05T17:48:02.593 回答
1

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

于 2013-02-05T17:48:19.723 回答