当我阅读关于内存模型、屏障、顺序、原子操作等相关内容时,经常会遇到“编译器栅栏”的概念,但通常它都是与“CPU栅栏”配对使用的。
然而,偶尔我也会看到一些仅适用于编译器的栅栏结构。例如C++11中的std::atomic_signal_fence
函数,cppreference.com上指出:
std::atomic_signal_fence
相当于std::atomic_thread_fence
,但不会发出任何用于内存排序的CPU指令。只有编译器对指令重新排序被禁止。
我有五个与此主题相关的问题:
如其名称所示
std::atomic_signal_fence
,在异步中断(例如线程被内核抢占以执行信号处理程序)的情况下,是否是使用仅编译器栅栏有用的唯一情况?它的实用性是否适用于所有体系结构,包括强排序的体系结构,如
x86
?能否提供一个具体的示例来证明仅编译器栅栏的实用性?
当使用
std::atomic_signal_fence
时,使用acq_rel
和seq_cst
排序是否有任何区别?(我希望这不会有任何区别。)这个问题可能已经被第一个问题涵盖了,但我还是很好奇,特别是关于它:是否必须在
thread_local
访问中使用栅栏?(如果需要的话,我期望仅编译器栅栏,如atomic_signal_fence
,是首选工具。)
谢谢。
atomic_signal_fence
(或其他仅限编译器的栅栏构造)可以用作潜在的优化。正如文章所述,Linux内核具有实现此方式的函数smp_rmb
和smp_wmb
。然而,我仍然对听到不受此假设限制的答案(如果存在的话)感兴趣。 - etherice