[英]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);
}
我想了解一些事情:
volatile
的std::sig_atomic_t
類型的變量是否正確? 鑒於變量在處理程序和線程之間共享 - 就像上面的gSignalStatus
但沒有volatile
。 根據這篇文章的答案,似乎需要volatile
。 extern“C”void atomic_signal_fence(memory_order order)noexcept; 6效果:等效於atomic_thread_fence(order),除了生成的排序約束僅在線程和在同一線程中執行的信號處理程序之間建立。
聽起來規范假定信號處理程序可以被任何線程調用,因此atomic_signal_fence
被添加到規范中? 但上面引用的規范也提到了“同一線索”。 因此,我很困惑。 在我的機器上,主線程調用信號處理程序。 一個例子來說明atomic_signal_fence
的需要也很好!
謝謝!
在您的特定用例中,使用sigwait
功能可能更節能且更合適。 不需要volatile
或std::atomic
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.