簡體   English   中英

volatile,std :: sig_atomic_t和atomic_signal_fence

[英]volatile, std::sig_atomic_t, and atomic_signal_fence

#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. 聲明一個沒有volatilestd::sig_atomic_t類型的變量是否正確? 鑒於變量在處理程序和線程之間共享 - 就像上面的gSignalStatus但沒有volatile 根據這篇文章的答案,似乎需要volatile
  2. 根據C ++標准:

    extern“C”void atomic_signal_fence(memory_order order)noexcept; 6效果:等效於atomic_thread_fence(order),除了生成的排序約束僅在線程和在同一線程中執行的信號處理程序之間建立。

聽起來規范假定信號處理程序可以被任何線程調用,因此atomic_signal_fence被添加到規范中? 但上面引用的規范也提到了“同一線索”。 因此,我很困惑。 在我的機器上,主線程調用信號處理程序。 一個例子來說明atomic_signal_fence的需要也很好!

謝謝!

在您的特定用例中,使用sigwait功能可能更節能且更合適。 不需要volatilestd::atomic

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM