是的,它是ISO C++中的UB;value = data[oldReadPosition]在C++抽象机器中,需要读取该对象的值。(通常这意味着左值到右值的转换,IIRC.) 但这几乎是无害的,可能只会在具有硬件竞争检测的机器上出现问题(不是普通的主流CPU,但可能在C实现上,如使用threadsanitizer的clang)。 另一个use-case用于non-atomic读取,然后检查可能的撕裂是SeqLock,在这里,读者可以通过在non-atomic读取之前和之后从原子计数器读取相同的值来证明没有撕裂。它在C++中是UB,即使对于non-atomic数据有volatile,但这可能有助于确保compiler-generatedasm是安全的。(由于内存障碍和现有编译器当前对原子的处理,即使non-volatile也能使asm正常工作)。请参阅在2threads固定不同CPU之间传递几个变量的最佳方法 atomic_thread_fence对于SeqLock是安全的仍然是必要的,并且原子负载的一些必要排序wrt。non-atomic可能是一个实现细节,如果它不能与某些东西同步并创建一个happens-before。 人们在现实生活中确实使用Seq锁,这取决于real-life编译器de-facto定义的行为比isoc++多一点。或者用另一种方式来说,就是现在碰巧工作;如果