示例
#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);
}
我试图了解几件事:
std::sig_atomic_t
而没有volatile
的变量是否正确?给定变量在处理程序和线程之间共享-就像上面的gSignalStatus
一样,但没有volatile
。根据{{3}}的回答,看来volatile
是必需的。外部“ C”无效atomic_signal_fence(存储器顺序)noexcept; 6个效果:等同于atomic_thread_fence(order),所产生的排序约束除外 仅在线程和在同一线程中执行的信号处理程序之间建立。
听起来像是规范假设信号处理程序可以被任何线程调用,所以atomic_signal_fence
被添加到规范了吗?但是上面引用的规范也提到了“相同的线程”。因此,我很困惑。在我的机器上,信号处理程序由主线程调用。一个说明atomic_signal_fence
需求的例子也很好!
谢谢!