是指向用户定义对象的c++指针,可线程安全读取

are c++ pointers to user-defined objects thread safe for reading?

本文关键字:指针 线程 读取 安全 c++ 用户 定义 对象      更新时间:2023-10-16

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

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

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

只有当一个值与其他使用它的线程同时修改时,才会发生数据争用

数据竞赛定义见§1.10/21:

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

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

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

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

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

只读数据唯一可能的问题是确保在读取完成时该值实际上已经初始化。如果在启动线程之前初始化该值,那么就可以了。

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

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