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

dsi*_*cha 8 x86 multithreading asynchronous thread-safety

是否存在任何现代的通用CPU,从不同的线程同时写入数组的相邻元素是不安全的?我对x86特别感兴趣.你可以假设编译器没有做任何明显荒谬的事情来增加内存粒度,即使它在技术上是在标准范围内.

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

注意:

请不要提及有关虚假共享的性能问题.我很清楚这些,但它们对我的用例没有实际意义.我也知道从除读者之外的线程写入的数据的可见性问题.我的代码解决了这个问题.

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

理论上,当硬件不需要时,编译器也可以通过这种方式实现内存写入,这在理论上是可行的,尽管非常愚蠢.x86可以解决单个字节,所以它主要不是问题,但我想弄清楚是否有任何奇怪的角落情况.更一般地,我想知道,如果写在不同的线程的阵列的相邻元件仍然是一个现实的问题或大多只是一种理论上只适用于掩盖/古硬件和/或很奇怪的编译器.

又一个编辑:这是一个很好的参考,描述了我正在谈论的问题:

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

Jim*_*hel 1

写入本机大小的值(即 1、2、4 或 8 字节)是原子的(嗯,8 字节仅在 64 位计算机上是原子的)。所以不行。编写本机类型总是会按预期编写。

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