volatile,std :: sig_atomic_t和atomic_signal_fence

时间:2018-07-24 13:45:33

标签: c++ c++11

示例

#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("%d\n", gSignalStatus);
}

我试图了解几件事:

  1. 声明类型为std::sig_atomic_t而没有volatile的变量是否正确?给定变量在处理程序和线程之间共享-就像上面的gSignalStatus一样,但没有volatile。根据{{​​3}}的回答,看来volatile是必需的。
  2. 根据C ++标准:
      

    外部“ C”无效atomic_signal_fence(存储器顺序)noexcept;   6个效果:等同于atomic_thread_fence(order),所产生的排序约束除外   仅在线程和在同一线程中执行的信号处理程序之间建立。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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