【发布时间】:2013-01-12 21:59:27
【问题描述】:
cppreference.com 将此函数记录为“线程和在同一线程中执行的信号处理程序之间的栅栏”。但是我在网上没有找到例子。
我想知道下面的伪代码是否正确地说明了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();
}
【问题讨论】:
-
我认为信号处理程序是来自 unix 系统类型的信号,它具有特殊的线程规则。
-
您的代码中没有任何信号处理程序,所以不,该代码没有展示任何关于
atomic_signal_fence的意义。 -
@StefanDragnev - 有了适当的围栏,就不需要
volatile。这就是原子和栅栏的全部意义所在。 -
@StefanDragnev - 不,不允许编译器使用栅栏或任何其他原子操作(使用适当的内存访问说明符)这样做。在这种情况下,
volatile是多余的。 -
A
signal_fence是 "compiler" barrier:它防止内存操作的编译时重新排序/组合/提升,但永远不会发出硬件内存屏障指令。 Jeff Preshing 的博客非常擅长解释这些内容,如果您不确定内存排序的内容,绝对是必读之物。
标签: c++ multithreading performance c++11 atomic