C++ 易失性、标准::信号和原子信号围栏

C++ 易失性、标准::信号和原子信号围栏,c++,c++11,C++,C++11,范例 #包括 #包括 #包括 挥发性标准:sig_原子信号状态=0; 无效信号处理器(int信号){ gSignalStatus=信号; } int main(){ //安装一个信号处理器 std::信号(SIGTERM,信号处理器); 而(gSignalStatus==0){ printf(“%d\n”,gSignalStatus); } 我试图了解一些事情: 使用类型为std::sig_atomic\u t而不使用volatile的变量声明是否正确?给定变量在处理程序和线程之间共享——就像

范例

#包括
#包括
#包括
挥发性标准:sig_原子信号状态=0;
无效信号处理器(int信号){
gSignalStatus=信号;
}
int main(){
//安装一个信号处理器
std::信号(SIGTERM,信号处理器);
而(gSignalStatus==0){
printf(“%d\n”,gSignalStatus);
}
我试图了解一些事情:

  • 使用类型为
    std::sig_atomic\u t
    而不使用
    volatile
    的变量声明是否正确?给定变量在处理程序和线程之间共享——就像上面的
    gSignalStatus
    一样,但是没有
    volatile
    。根据的答案,似乎需要
    volatile
  • 根据C++标准: 外部“C”无效原子信号围栏(内存顺序)无异常; 6效果:相当于原子线程围栏(顺序),但产生的顺序约束除外 仅在线程和在同一线程中执行的信号处理程序之间建立

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


    谢谢

    在您的特定用例中,使用该功能可能更省电、更合适。不需要
    volatile
    std::atomic

    <代码>易失性>代码>与多线程无关。注意,你链接的问题是关于C和引用C标准,而你的问题是C++标记,并且是C++代码。在这种情况下,我不能说C和C++是否相同,但很有可能它们不是。<代码> STD::原子GSIGALALSTATE=0;<代码>是正确的方法。这个方法很有趣,但似乎过于简洁。对于C++修改中的用法更改有很多有用的地方。这个例子只是为了举例说明。我的主要目标是试图找到我所问的两个问题的答案,以便正确有效地使用std::signal。在我的实际应用程序中,我的主线程运行一个紧密的循环来完成工作,如果检测到SIGTERM,它将进行清理并退出循环。
    #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);
    }