我了解 DSB、DMB 和 ISB 是防止指令重新排序的障碍。我也可以为它们中的每一个找到很多非常好的解释,但是很难想象我必须使用它们的情况。
另外,从开源代码中,我不时看到这些障碍,但很难理解为什么要使用它们。举个例子,在Linux kernel 3.7 tcp_rcv_synsent_state_process函数中,有如下一行:
if (unlikely(po->origdev))
sll->sll_ifindex = orig_dev->ifindex;
else
sll->sll_ifindex = dev->ifindex;
smp_mb();
if (po->tp_version <= TPACKET_V2)
__packet_set_status(po, h.raw, status);
其中 smp_mb() 基本上是 DMB。你能给我一些你在现实生活中的例子吗?这将有助于更多地了解障碍。