不,您的代码没有证明atomic_signal_fence
. 当您引用 cppreference.com 时,atomic_signal_fence
仅在信号处理程序和在同一线程上运行的其他代码之间执行同步。这意味着它不会在两个不同的线程之间执行同步。您的示例代码显示了两个不同的线程。
C++ 规范包含有关此函数的以下注释:
注意:编译器优化和加载和存储的重新排序以与 with 相同的方式被禁止atomic_thread_fence
,但 atomic_thread_fence 将插入的硬件围栏指令不会发出。
注意: atomic_signal_fence
可用于指定线程执行的操作对信号处理程序可见的顺序。
这是一个正确的(如果不是激励性的)用法示例:
static_assert(2 == ATOMIC_INT_LOCK_FREE, "this implementation does not guarantee that std::atomic<int> is always lock free.");
std::atomic<int> a = 0;
std::atomic<int> b = 0;
extern "C" void handler(int) {
if (1 == a.load(std::memory_order_relaxed)) {
std::atomic_signal_fence(std::memory_order_acquire);
assert(1 == b.load(std::memory_order_relaxed));
}
std::exit(0);
}
int main() {
std::signal(SIGTERM, &handler);
b.store(1, std::memory_order_relaxed);
std::atomic_signal_fence(std::memory_order_release);
a.store(1, std::memory_order_relaxed);
}
如果遇到断言,则保证为真。