Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是c++;指向线程安全的用户定义对象的指针,用于读取?_C++_Multithreading_Pointers_Thread Safety - Fatal编程技术网

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

C++ 是c++;指向线程安全的用户定义对象的指针,用于读取?,c++,multithreading,pointers,thread-safety,C++,Multithreading,Pointers,Thread Safety,我找不到答案,但这是一个简单的问题: 在两个线程中,读取C++中的用户定义对象的指针是否安全,同时没有锁或任何其他的ShanaGIN? < P>如果线程中的变量被修改,通常是线程安全的。在C++03中,这是不正确的,因为C++03并不真正了解线程。在C++11中,您有一个专用于指针的指针。从多个线程读取值总是安全的。只有在同时写入数据时,才需要管理并发访问 只读数据唯一可能的问题是确保在读取完成时该值实际上已经初始化。如果在开始线程之前初始化该值,则不会有问题。是。实际上,同时读取任何值(内置类

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


在两个线程中,读取C++中的用户定义对象的指针是否安全,同时没有锁或任何其他的ShanaGIN?

< P>如果线程中的变量被修改,通常是线程安全的。在C++03中,这是不正确的,因为C++03并不真正了解线程。在C++11中,您有一个专用于指针的指针。

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


只读数据唯一可能的问题是确保在读取完成时该值实际上已经初始化。如果在开始线程之前初始化该值,则不会有问题。

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

只有当值与使用它的其他线程同时修改时,才会发生数据争用。该标准对此的主要陈述如下:

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

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

如果§1.10/4中定义了冲突:

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


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

他明确表示,他感兴趣的是读取,而不是原子写入。如果我在堆栈上有一个指针,两个线程都有该指针的地址,并且只想反复读取它的值,这会导致任何问题吗?@paul13243546:总是有对值的写入,即使只是初始化和删除。现代CPU对不同的内核使用不同的缓存;因此,在一个或另一个核心中可能不会注意到值的更改。如果要从多个线程访问,请使用std::atomic。从多个线程读取值并不总是安全的。许多CPU对每个核心使用单独的缓存,因此,对一个核心上的值的更改在另一个核心上可能不可见
volatile
无法解决此问题,因此必须使用显式加载和存储(std::atomic提供了出色的功能)。不管问题的参数是什么,总是会有对值的写入,即使只是初始化和删除。@Soupd'Campbells-再说一次:如果你所做的只是读取,你不需要同步,除非确保值已经初始化。在开始任何线程之前初始化都会解决这个问题。@Soupd'campbell-工程是基于理解,而不是基于略读。对不起,不,Soup d'campbell,这些语句远远不相等。说真的,冷静点!你在争论一些次要的语言细节,这样做只会让你看起来像个疯狂的疯子。特别是,你不能要求人们写“在先决条件a下,你可以做B”,而不是“如果你确保a得到满足,你可以做B”。在技术层面上,甚至没有任何分歧,但你忙着吐毒液,甚至没有注意到这一点。