【发布时间】:2020-03-13 13:25:31
【问题描述】:
根据cppreference.com(我在标准中没有搜索到),使用信号处理程序中的静态对象是UB。
为什么UB要做这样的事情?这有什么潜在的问题?
如果信号处理程序因
std::abort或std::raise(异步信号)而被调用,则如果 [...] 信号处理程序引用的任何对象的静态存储持续时间不是std::atomic(C++11 起)或volatile std::sig_atomic_t。
【问题讨论】:
-
最可能的原因:线程安全。非原子全局变量不能安全地被多个线程使用,除非您使用互斥锁或其他线程同步方法。
-
POSIX/C 的同样问题是answered here。
-
@NathanOliver :由于存在死锁的风险,(常规)互斥锁对信号处理程序没有多大帮助。
std::mutex信号不安全是有原因的。 -
@Peregring-lk :
mallocis not signal safe - 你不应该从信号处理程序中调用它。 -
@SanderDeDycker:该标准将此类问题视为其管辖范围之外的实施质量。对于没有信号安全的 malloc 就不可能完成的任务的实现需要使其信号安全才能适用于此类任务;那些不适合此类任务的人不需要使其信号安全。
标签: c++ signals undefined-behavior