这是一个复杂的问题,请在回答之前仔细考虑。
考虑这种情况。两个线程(一个读取器和一个写入器)访问一个全局int
. 这安全吗?通常,我会不假思索地回应,是的!
然而,在我看来,赫伯萨特并不这么认为。在他关于有效并发的文章中,他讨论了一个有缺陷的无锁队列和更正的版本。
在第一篇文章的结尾和第二篇文章的开头,他讨论了一个很少被考虑的变量特征,即写顺序。整数是原子的,很好,但整数不一定是有序的,这可能会破坏任何无锁算法,包括我上面的场景。我完全同意,在当前和未来的所有平台上保证正确的多线程行为的唯一方法是使用原子(AKA 内存屏障)或互斥锁。
我的问题; 在真正的硬件上写重排是一个问题吗?还是多线程的偏执狂只是迂腐?
那么经典的单处理器系统呢?
更简单的 RISC 处理器(如嵌入式 power-pc)呢?
澄清:我对 Sutter 先生所说的关于硬件(处理器/缓存)重新排序变量写入的内容更感兴趣。我可以通过编译器开关或在编译后手动检查程序集来阻止优化器破坏代码。但是,我想知道硬件在实践中是否仍然会弄乱代码。