我想知道这种情况是否可行,或者CPU是否保证这不会发生在如此低的水平:
假设有一个未对齐的值,需要2次读取才能获得整个值(在32位系统上32位值未对齐)。所以两个线程只执行一条指令,线程1是从内存读取的mov,线程2是写入内存的原子mov。
所以现在线程1将包含2个不同值的一半。
这种情况是否可行,或者CPU是否保证不会发生这种情况?
答案 0 :(得分:2)
这是我的非专家anwser ......
使错位访问成为原子相当复杂,所以我相信大多数架构在这种情况下都不能提供任何形式的原子性保证。 (我不知道任何可以进行原子未对齐取物的架构,但它们可能存在。我不知道足以告诉。)
获取错位数据甚至更复杂;所以想要让事情变得非常简单的架构甚至不允许错位访问(例如,非常#34; RISC-y"旧的Alpha架构)。
在某些体系结构上可能通过以某种方式在本地缓存中同时锁定(或保护,见下文)两个缓存行来实现它,但是这些东西通常在用户土地&#39中不可用。 ;即非OS线程。
请参阅http://en.wikipedia.org/wiki/Load-link/store-conditional以获得一个(对齐的)字的加载 - 存储(即,无撕裂读取两个未对齐区域)原子性的现代方法。现在,如果一个线程以某种方式被允许发出两个已连接(原子)' protect'像这样的指示,我想它可以完成,但话又说回来,那将是复杂的。我不知道是否存在于任何CPU上。