volatile, std::sig_atomic_t, and 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("%dn", gSignalStatus);
}
我正在努力理解一些事情:
- 声明一个类型为
std::sig_atomic_t
的变量而不声明volatile
是否正确?给定变量在处理程序和线程之间共享——就像上面的gSignalStatus
,但没有volatile
。根据这篇文章的回答,似乎需要volatile
- 根据C++标准:
extern"C"void atomic_signal_fence(memory_order order(noexcept;6效果:等效于atomic_thread_fence(order(,除了生成的排序约束仅在线程和在同一线程中执行的信号处理程序之间建立。
听起来规范假设信号处理程序可以被任何线程调用,所以atomic_signal_fence
被添加到规范中?但上面引用的规范也提到了"相同的线程"。因此,我感到困惑。Tho,在我的机器上,信号处理程序是由主线程调用的。一个例子来说明atomic_signal_fence
的需求也很好!
谢谢!
在您的特定用例中,使用sigwait
函数可能更节能,也更合适。不需要volatile
或std::atomic
。
相关文章:
- 如何从 std::atomic 中提取指针 T<T>?
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- std::memory_order for std::atomic:<T>:wait
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 在 lambda 表达式中使用 std::atomic
- C++std::atomic在程序员级别保证了什么
- 如果在 2 个线程中使用,是否值得将size_t声明为 std::atomic?
- MyType 允许 std::atomic 的确切要求是什么<MyType>?
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- gcc Atomic在gcc 4.1.1中内置了奇怪的行为
- 在 C++20 之前和之后初始化 std::atomic
- Red Hat:使用<atomic>编译很好,但链接器找不到__atomic_store_16;什么库?
- std::atomic 和 std::mutex 的相对性能
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 简单使用 std::atomic 在两个线程之间共享数据
- Port pthread_cond_broadcast to std::atomic
- std::atomic中的任何内容都是免费等待的
- 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
- 在 atomic() 中 ++、add operation 和 fetch_add() 有什么区别
- 最接近"std::atomic<std::vector>"是什么?