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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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++;11原子能自动解决变量读写上的多核竞争?_C++_Multithreading_C++11_Atomic_Core - Fatal编程技术网

C++ c++;11原子能自动解决变量读写上的多核竞争?

C++ c++;11原子能自动解决变量读写上的多核竞争?,c++,multithreading,c++11,atomic,core,C++,Multithreading,C++11,Atomic,Core,我知道,当多个线程读写变量时,atomic将对类型“T”变量应用锁,确保其中只有一个线程在执行R/W 但在多cpu核心计算机中,线程可以在不同的核心上运行,不同的核心将具有不同的一级缓存、二级缓存,而共享三级缓存。我们知道C++编译器有时会优化登记在寄存器中的变量,这样如果变量不存储在内存中,那么变量之间的不同核心缓存之间就不会有内存同步。 所以我的担心/问题是,如果一个原子变量被编译器优化为某个寄存器变量,那么它就不会存储在内存中,当一个核写入它的值时,另一个核可能会读出一个过时的值,对吗?是

我知道,当多个线程读写变量时,atomic将对类型“T”变量应用锁,确保其中只有一个线程在执行R/W

但在多cpu核心计算机中,线程可以在不同的核心上运行,不同的核心将具有不同的一级缓存、二级缓存,而共享三级缓存。我们知道C++编译器有时会优化登记在寄存器中的变量,这样如果变量不存储在内存中,那么变量之间的不同核心缓存之间就不会有内存同步。 所以我的担心/问题是,如果一个原子变量被编译器优化为某个寄存器变量,那么它就不会存储在内存中,当一个核写入它的值时,另一个核可能会读出一个过时的值,对吗?是否有任何关于此数据一致性的保证


谢谢。

您可能正在寻找:

[intro.progress]/18实现应确保原子或同步操作分配的最后一个值(按修改顺序)在有限时间内对所有其他线程可见


您可能正在寻找以下内容:

[intro.progress]/18实现应确保原子或同步操作分配的最后一个值(按修改顺序)在有限时间内对所有其他线程可见

原子不能像你模糊地描述的那样“解决”问题。它提供了基于顺序的内存旋转一致性的特定保证

不同的编译器在不同的平台上以不同的方式实现这些保证

在x86/64上,对于大小合理的原子整数和指针,不使用锁。硬件提供了比标准要求更强的保证,使得一些更深奥的选项相当于完全一致性

我不能完全回答你的问题,但我可以为你指出正确的方向;你需要学习的主题是“C++内存模型”。 也就是说,原子学的存在是为了避免你所描述的确切问题。如果您要求完整的内存顺序一致性,并且线程A修改x y,则没有其他线程可以看到Y修改但不X。C++提供的保证如何不由C++标准指定;缓存线失效、使用特殊指令进行访问、禁止编译器进行某些基于寄存器的优化等都是编译器要做的事情

注意到C++内存模型被精炼、修改和擦除C++ 17,以描述新的并行算法的行为,并允许其在GPU硬件(其他点)上有效地实现,并影响了新GPU硬件提供的保证。因此,谈论内存模型的人可能会很兴奋,他们谈论的是比您主要关心的C++11更现代的问题

这是一个非常复杂的话题。编写您认为是可移植的代码非常容易,但只在特定平台上工作,或者通常只在您测试它的平台上工作。但这仅仅是因为线程很难实现。

Atomic并不像您模糊地描述的那样“解决”问题。它提供了基于顺序的内存旋转一致性的特定保证

不同的编译器在不同的平台上以不同的方式实现这些保证

在x86/64上,对于大小合理的原子整数和指针,不使用锁。硬件提供了比标准要求更强的保证,使得一些更深奥的选项相当于完全一致性

我不能完全回答你的问题,但我可以为你指出正确的方向;你需要学习的主题是“C++内存模型”。 也就是说,原子学的存在是为了避免你所描述的确切问题。如果您要求完整的内存顺序一致性,并且线程A修改x y,则没有其他线程可以看到Y修改但不X。C++提供的保证如何不由C++标准指定;缓存线失效、使用特殊指令进行访问、禁止编译器进行某些基于寄存器的优化等都是编译器要做的事情

注意到C++内存模型被精炼、修改和擦除C++ 17,以描述新的并行算法的行为,并允许其在GPU硬件(其他点)上有效地实现,并影响了新GPU硬件提供的保证。因此,谈论内存模型的人可能会很兴奋,他们谈论的是比您主要关心的C++11更现代的问题


这是一个非常复杂的话题。编写您认为是可移植的代码非常容易,但只在特定平台上工作,或者通常只在您测试它的平台上工作。但这只是因为线程很难实现。

这是某种
std::atomic
的存在理由。但是请注意,它不一定需要锁。该类型中甚至还内置了一个测试。请提供一些示例代码,以表示编译器可能错误编译原子变量的潜在问题。这有点像
std::atomic
的存在理由。但是请注意,它不一定需要锁。该类型中甚至还内置了一个测试。请提供一些示例代码,表示编译器可能会错误编译原子变量的潜在问题。请注意,在standardese中,“应该”表示“这是一个好主意,但不是必需的”。请注意,standardese中的“应该”表示“这是一个好主意,但不是必需的”。@好奇我说哪里?程序通过指令执行。这里是对原子x86指令的分析:@好奇我说哪里?程序通过指令执行。这是一个分析