cppreference.com把这个函数描述为“线程和执行在同一线程中的信号处理程序之间的障碍(fence)”。但我在互联网上没有找到任何示例。
我想知道以下伪代码是否正确地说明了std::atomic_signal_fence()
的功能:
int n = 0;
SignalObject s;
void thread_1()
{
s.wait();
std::atomic_signal_fence(std::memory_order_acquire);
assert(1 == n); // never fires ???
}
void thread_2()
{
n = 1;
s.signal();
}
int main()
{
std::thread t1(thread_1);
std::thread t2(thread_2);
t1.join(); t2.join();
}
atomic_signal_fence
的任何有意义的内容。 - Kerrek SBvolatile
。这正是原子操作和栅栏的关键所在。 - Pete Beckervolatile
关键字,只要使用围栏或其他原子操作(使用适当的内存访问说明符),编译器就不允许这样做。在这种情况下,volatile
是多余的。 - Pete Beckersignal_fence
是一种“编译器屏障”,它可以防止编译器对内存操作进行重新排序/合并/提升,但永远不会发出硬件内存屏障指令。Jeff Preshing的博客非常好地解释了这个问题,如果您对内存排序方面还不确定,那么肯定要读一读。 - Peter Cordes