volatile, std::sig_atomic_t, and atomic_signal_fence

volatile, std::sig_atomic_t, and atomic_signal_fence

本文关键字:atomic fence and signal volatile std sig      更新时间:2023-10-16

示例

#include <csignal>
#include <cstdio>
#include <cstdlib>
volatile std::sig_atomic_t gSignalStatus = 0;
void signal_handler(int signal) {
gSignalStatus = signal;
}
int main() {
// Install a signal handler
std::signal(SIGTERM, signal_handler);
while (gSignalStatus == 0) {}
printf("%dn", gSignalStatus);
}

我正在努力理解一些事情:

  1. 声明一个类型为std::sig_atomic_t的变量而不声明volatile是否正确?给定变量在处理程序和线程之间共享——就像上面的gSignalStatus,但没有volatile。根据这篇文章的回答,似乎需要volatile
  2. 根据C++标准:

    extern"C"void atomic_signal_fence(memory_order order(noexcept;6效果:等效于atomic_thread_fence(order(,除了生成的排序约束仅在线程和在同一线程中执行的信号处理程序之间建立。

听起来规范假设信号处理程序可以被任何线程调用,所以atomic_signal_fence被添加到规范中?但上面引用的规范也提到了"相同的线程"。因此,我感到困惑。Tho,在我的机器上,信号处理程序是由主线程调用的。一个例子来说明atomic_signal_fence的需求也很好!

谢谢!

在您的特定用例中,使用sigwait函数可能更节能,也更合适。不需要volatilestd::atomic