Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Multithreading 多线程非原子操作与原子_Multithreading_Assembly - Fatal编程技术网

Multithreading 多线程非原子操作与原子

Multithreading 多线程非原子操作与原子,multithreading,assembly,Multithreading,Assembly,我想知道这种情况是否可能,或者CPU是否保证在如此低的级别上不会发生这种情况: 假设有一个值未对齐,需要2次回迁才能获得整个值(32位系统上的32位值未对齐)。所以两个线程只执行一条指令,线程1是从内存读取的mov,线程2是向内存写入的原子mov 线程1获取值的前一半 线程2以原子方式写入值 线程1获取值的后半部分 现在,线程1将包含两个不同值的半部分 这种情况是否可能,或者CPU是否保证不会发生这种情况?这是我的非专家anwser 使未对齐的访问原子化是相当复杂的,因此我相信在这种情况下,

我想知道这种情况是否可能,或者CPU是否保证在如此低的级别上不会发生这种情况:

假设有一个值未对齐,需要2次回迁才能获得整个值(32位系统上的32位值未对齐)。所以两个线程只执行一条指令,线程1是从内存读取的mov,线程2是向内存写入的原子mov

  • 线程1获取值的前一半
  • 线程2以原子方式写入值
  • 线程1获取值的后半部分
现在,线程1将包含两个不同值的半部分


这种情况是否可能,或者CPU是否保证不会发生这种情况?

这是我的非专家anwser

使未对齐的访问原子化是相当复杂的,因此我相信在这种情况下,大多数体系结构都不能保证原子性。(我不知道有哪种体系结构可以进行原子错位抓取,但它们可能存在。我知道的还不够多。)

仅仅获取未对齐的数据甚至很复杂;因此,想要保持事情真正简单的架构甚至不允许不对齐的访问(例如非常“RISC-y”的旧Alpha架构)

在某些体系结构上,可以通过某种方式在本地缓存中同时锁定(或保护,见下文)两条缓存线来实现这一点,但在“用户区”(即非操作系统线程)中,这类功能通常不可用


有关实现一个(对齐的)字的加载存储(即两个未对齐区域的无撕裂读取)原子性的现代方法,请参阅。现在,如果一个线程以某种方式被允许发出两个连接的(原子的)“保护”指令,我想这是可以做到的,但同样,这将是复杂的。我不知道这是否存在于任何CPU上

你在说什么建筑?说到原子性,它们都有很大的不同。尽管如此,我不知道有哪一个系统有一个原子存储到未对齐的地址。当然这是可能的,当该值跨越一级缓存线时,就会发生这种情况。例如,一条缓存线中有两个字节,另一条缓存线中有两个字节。原子读取或写入这样的值是不可能的。为了避免这种情况,需要正确对齐。在编译语言中几乎从来没有出现过问题,因为编译器选择地址,这在汇编语言中肯定是可能的。在8位体系结构中也是如此。字节写入/读取通常是原子的。在中断中,16位存储器通常是原子中断禁用的。