std::atomic 信号安全吗?
Is std::atomic signal-safe?
我正在开发一个 Linux 应用程序,它需要能够处理大量突发信号。尽管信号处理程序会 运行 很快(我计划最多 cpu 周期),但信号会突然出现,理想情况下我会完全禁用信号屏蔽(即使不是它们自己,请参阅 SA_NODEFER 在 sigaction).
因此,我需要以完全可重入的方式实现信号处理程序。我认为 std::atomic 对这项任务很有用,但我认为,std::atomic 是为处理基于线程的竞争条件而开发的,不一定是来自堆叠在信号处理程序上的竞争问题。
如果 is_lock_free
是 true
那么你没问题,否则如果在主线程和信号处理程序中访问相同的原子变量,或者在较低和较高的优先级中,你可能会死锁信号处理程序:请记住它们都共享一个堆栈,运行 处理程序无法让被中断的代码继续运行足够长的时间来解锁资源(无需简单地返回并且不执行自己的工作)。
我正在开发一个 Linux 应用程序,它需要能够处理大量突发信号。尽管信号处理程序会 运行 很快(我计划最多 cpu 周期),但信号会突然出现,理想情况下我会完全禁用信号屏蔽(即使不是它们自己,请参阅 SA_NODEFER 在 sigaction).
因此,我需要以完全可重入的方式实现信号处理程序。我认为 std::atomic 对这项任务很有用,但我认为,std::atomic 是为处理基于线程的竞争条件而开发的,不一定是来自堆叠在信号处理程序上的竞争问题。
如果 is_lock_free
是 true
那么你没问题,否则如果在主线程和信号处理程序中访问相同的原子变量,或者在较低和较高的优先级中,你可能会死锁信号处理程序:请记住它们都共享一个堆栈,运行 处理程序无法让被中断的代码继续运行足够长的时间来解锁资源(无需简单地返回并且不执行自己的工作)。