首页 > 解决方案 > 使用 shared_ptr 在中断时结束多线程循环

问题描述

因此,当我中断程序(使用 SIGINT)时,我试图优雅地关闭循环中的多个线程。现在,我使用一个回调来更改 shared_ptr 的状态(已复制到每个线程),以向所有其他线程指示是时候中断循环了(线程在每次迭代时检查 shared_ptr 的状态)。这行得通,但我想知道这是否是“好的”编程实践?

标签: c++

解决方案


不,不能保证在信号处理程序中修改共享指针是安全的。跨多个线程修改共享指针也不是安全的(除了复制,尽管修改了内部状态是安全的)

安全的是volatile std::sig_atomic_t用作标志并在信号处理程序中修改它。但是,sig_atomic_t不保证与处理信号的线程以外的其他线程同步。

如果您可以依赖std::atomic<bool>无锁(标准不保证),那么它对于在信号处理程序中进行修改以及保证线程同步也是有效的。

否则,您可以为信号处理程序使用本地线程volatile std::sig_atomic_t,一旦在一个线程中检测到更改,就使用辅助线程同步方法(原子、条件变量等)将信息广播到其他线程。

另一种方法:您可以让一个线程简单地等待信号(不需要 sig-atomic 标志),一旦收到,继续线程同步广播(与之前建议的第二阶段相同)。请注意,必须为其他线程屏蔽该信号,以便将其提供给等待线程来处理。但是,在标准 C++ 中没有用于等待信号的好的 API。sigwait如果您可以依赖它,那么在 POSIX 标准中有。


推荐阅读