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++_Multithreading_X86_X86 64 - Fatal编程技术网

C++ 根据数据总线,从多个不带保护的线程设置变量

C++ 根据数据总线,从多个不带保护的线程设置变量,c++,multithreading,x86,x86-64,C++,Multithreading,X86,X86 64,我在x64上使用C++多线程。我想更好地理解数据总线。我想了解如果我试图在没有任何保护(没有互斥、CV、信号量和原子)的情况下从两个线程设置变量,会发生什么。什么是依赖于数据总线的。 例如,如果我有变量: int32_t i; 如果我在不同的线程中设置变量: 线程1: i =0x11223344; 线程2: i =0x44332211; 据我所知,x64数据总线是64位的。所以变量i可以在1指令中设置。我知道这取决于编译器。我知道缓存也有影响力。我只想知道与数据总线的交互(没有缓

我在x64上使用C++多线程。我想更好地理解数据总线。我想了解如果我试图在没有任何保护(没有互斥、CV、信号量和原子)的情况下从两个线程设置变量,会发生什么。什么是依赖于数据总线的。 例如,如果我有变量:

 int32_t i;
如果我在不同的线程中设置变量: 线程1:

  i =0x11223344;
线程2:

  i =0x44332211;

据我所知,x64数据总线是64位的。所以变量i可以在1指令中设置。我知道这取决于编译器。我知道缓存也有影响力。我只想知道与数据总线的交互(没有缓存)。我的问题是什么行为取决于数据总线宽度(8、16、32位)。i的价值是什么?

不幸的是,你的问题没有明确的答案

让我们远离C++,您要做的是执行一个非同步并发写。根据许多因素,您可以对此类操作的结果做出的保证会有很大的不同。当然,目标体系结构起着重要作用。一台具有强大内存模型(如x86)的机器可能比PowerPC或ARM机器更宽容。但它并没有就此结束。对齐可以发挥关键作用,运行机器上的特定内存配置也可以发挥关键作用(想想NUMA体系结构)。因此,没有一个一刀切的答案。这完全取决于环境,即使环境是准确的,你通常得到的答案是:我们无法判断,它最终可能是任何东西(包括一个凭空出现的数字,也就是说,一个不是由任何一个并发写入操作写入的值),因为硬件就是这样构建的

因此,在如此高的层次上讨论这个问题根本没有意义。就x86而言,指令集体系结构提供了一些保证。请随意浏览您自己的相关部分。但是,如果您使用的是线程无关的内存访问,则无法从更高级别的语言中访问这些保证。因为行为是未定义的,所以编译器可以执行任意数量的优化,这些优化可以以任意方式破坏生成的代码,但仍然与您在代码中表达的内容保持一致。因为您的代码不知道并发性(根据定义,当您使用非同步访问时),编译器完全有权这样做


因此,唯一的解决办法是使用适当的同步,例如锁或原子。它们在语言级别(不允许某些编译器优化)和硬件(通过在生成的机器代码中插入必要的同步指令)上都提供了某些保证。只有拥有从高级语言到构成硬件的硅芯片的完整保证链,才能进行正确的多线程编程。从链条上拆下任何一个环节,整个链条就会倒塌。

没有什么需要了解的。在构成当前C++标准的1400页中,没有提到任何被描述为“数据总线”的东西。C++只是说这是未定义的行为,因此在回答问题时没有帮助。您需要将程序编译成汇编,然后查找这些汇编指令的作用,以了解代码的作用(这显然会根据编译器标志和其他内容而变化)。您应该发布汇编代码,以便至少有一个答案。我的问题是,如果集合在一个指令中,都将是原子的。简单答案:不。C++的行为是未定义的。请注意,原子性实际上不是这里最大的问题,而是内存排序。如果你不知道原子写入何时对另一个核心可见,那么它是无用的。@ComicSanms你介意提供详细信息或至少参考吗?是的,你适合高级。我在想,在and处,值应该是两个值中的一个,或者像(0x11222211)那样的字节混合。这样的问题最好是在装配级别上提出,或者只是在硬件级别上提出。我的问题只是出于好奇。谢谢你提供的详细信息。我将阅读手册中的内容。@Vladimir-在x64上,一个正确对齐的整数值总是一次写入,所以它不会“混合”。然而,除非它是原子的,否则根本不能保证它被写入内存。此外,编译器可能会利用硬件功能,使用与“正常”值相同的指令来读写原子值。它只需确保在适当的时间完成。