CPU指令的原子性

Atomic vs. Non-Atomic Operations

首先需要注意有些指令是宏,并不是真正的单条指令

单条指令并不都是原子的

armv7提供了一条指令将两个32位寄存器组成64位,存储到内存中去,这条指令有torn write的风险

x86 纯读写指令只有在不跨cache line情况下才能保证原子

c++ - Is incrementing an int effectively atomic in specific cases? - Stack Overflow

x86指令add DWORD PTR [rbp - 4] 1 具有CISC风格

可以被归类为Read Modify Write

这条指令设计多个uop

在这条指令中,涉及了两次总线的获取和释放,中间存在可以插入acquire的机会

AGENT 1          AGENT 2

load X              
inc C
                 load X
                 inc C
                 store X
store X

lock前缀使得这条指令变成原子的,此外还有内存屏障功能

cache locking+缓存一致性

TODO

跨cache line的情况,以及失败的原子指令 原子指令对一致性的性能影响 c++ - Atomicity of loads and stores on x86 - Stack Overflow

单处理器系统只需提防中断,并行IO设备,DMA

赋值和构造的开销不一定差不多

对于字符串和容器类这些容器,赋值时可以考虑直接重用已分配的空间,而构造一定会开辟新空间。

因此这些类如果对性能有需求,不应在赋值函数使用copy-and-swap idiom

String& operator=(String&& rhs) noexcept{ 
	String(std::move(rhs)).swap(*this);  //这里构造临时对象个人理解是防止自赋值
	return *this; 
}