当我阅读有关内存模型、障碍、排序、原子等的内容时,经常会出现编译器栅栏的概念,但通常它也与CPU 栅栏配对,但正如人们所期望
然而,有时我会读到只适用于编译器的栅栏结构。这方面的一个例子是 C++11std::atomic_signal_fence
函数,它在cppreference.com上声明:
std::atomic_signal_fence 等价于 std::atomic_thread_fence,除了不发出内存排序的 CPU 指令。仅编译器对指令的重新排序被抑制为 order instructs。
我有五个与此主题相关的问题:
顾名思义
std::atomic_signal_fence
,异步中断(例如线程被内核抢占以执行信号处理程序)是仅编译器围栏有用的唯一情况吗?它的用处是否适用于所有架构,包括强排序架构,例如
x86
?是否可以提供一个具体的示例来演示仅编译器围栏的有用性?
使用时,使用和订购
std::atomic_signal_fence
有什么区别吗?(我希望它没有任何区别。)acq_rel
seq_cst
第一个问题可能涵盖了这个问题,但我很好奇,无论如何都要特别问一下:是否有必要使用带有
thread_local
访问权限的栅栏?(如果有的话,我希望编译器专用的栅栏成为atomic_signal_fence
首选工具。)
谢谢你。