gpt4 book ai didi

multithreading - 从不同的线程写入相邻的数组元素?

转载 作者:行者123 更新时间:2023-12-03 22:43:05 24 4
gpt4 key购买 nike

是否有任何现代通用 CPU 从不同线程并发写入数组的相邻元素是不安全的?我对 x86 特别感兴趣。您可能会认为编译器没有做任何明显荒谬的事情来增加内存粒度,即使它在技术上符合标准。

我对编写任意大结构的情况感兴趣,而不仅仅是 native 类型。

笔记:

请不要提及有关虚假共享的性能问题。我很清楚这些,但它们对我的用例没有实际意义。我也知道关于从读取器以外的线程写入的数据的可见性问题。这在我的代码中得到了解决。

澄清:出现这个问题是因为在某些处理器(例如,旧的 DEC Alphas)上,内存只能在字级解决。因此,以非字大小增量(例如,单个字节)写入内存实际上涉及要写入的字节的读-修改-写加上一些相邻的字节 在引擎盖下。为了形象化这一点,请考虑写入单个位所涉及的内容。您读入字节或字,对整个事物执行按位运算,然后将整个事物写回。因此,您不能安全地从不同线程同时写入相邻位。

当硬件不需要时,编译器以这种方式实现内存写入,理论上也是可能的,虽然完全愚蠢。 x86 可以处理单个字节,所以这基本上不是问题,但我想弄清楚是否有任何奇怪的角落情况。更一般地说,我想知道从不同线程写入数组的相邻元素是否仍然是一个实际问题,或者主要只是一个仅适用于晦涩/古老硬件和/或非常奇怪的编译器的理论问题。

另一个编辑:这是一个很好的引用,描述了我正在谈论的问题:

http://my.safaribooksonline.com/book/programming/java/0321246780/threads-and-locks/ch17lev1sec6

最佳答案

写入 native 大小的值(即 1、2、4 或 8 字节)是原子的(好吧,8 字节仅在 64 位机器上是原子的)。所以不行。编写 native 类型将始终按预期编写。

如果您正在编写多个 native 类型(即循环编写数组),那么如果操作系统内核中存在错误或中断处理程序没有保留所需的寄存器,则可能会出错。

关于multithreading - 从不同的线程写入相邻的数组元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5380438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com