c++ - 使用 shared_ptr 在中断时结束多线程循环
问题描述
因此,当我中断程序(使用 SIGINT)时,我试图优雅地关闭循环中的多个线程。现在,我使用一个回调来更改 shared_ptr 的状态(已复制到每个线程),以向所有其他线程指示是时候中断循环了(线程在每次迭代时检查 shared_ptr 的状态)。这行得通,但我想知道这是否是“好的”编程实践?
解决方案
不,不能保证在信号处理程序中修改共享指针是安全的。跨多个线程修改共享指针也不是安全的(除了复制,尽管修改了内部状态是安全的)
安全的是volatile std::sig_atomic_t
用作标志并在信号处理程序中修改它。但是,sig_atomic_t
不保证与处理信号的线程以外的其他线程同步。
如果您可以依赖std::atomic<bool>
无锁(标准不保证),那么它对于在信号处理程序中进行修改以及保证线程同步也是有效的。
否则,您可以为信号处理程序使用本地线程volatile std::sig_atomic_t
,一旦在一个线程中检测到更改,就使用辅助线程同步方法(原子、条件变量等)将信息广播到其他线程。
另一种方法:您可以让一个线程简单地等待信号(不需要 sig-atomic 标志),一旦收到,继续线程同步广播(与之前建议的第二阶段相同)。请注意,必须为其他线程屏蔽该信号,以便将其提供给等待线程来处理。但是,在标准 C++ 中没有用于等待信号的好的 API。sigwait
如果您可以依赖它,那么在 POSIX 标准中有。
推荐阅读
- node.js - npm 本地开发与生产包版本
- python - 从数据库中获取数据并与用户输入的数据进行比较的代码。如果等于则需要登录。怎么做
- javascript - 如何将daat存储到laravel中的localStorage
- javascript - 如何在 express 中创建一个包罗万象的异步错误处理程序?
- delphi - 如何检查我的应用程序的任务栏图标是否可见?
- electron - 电子中的节点画布——“映射文件没有 cdhash,完全未签名?代码必须至少是临时签名的。”
- vba - 是否有像 BeforeFolderMove 这样的事件来复制文件夹?
- c - C makefile 问题,未定义的函数引用
- php - 为什么我的 React 路由器无法正常运行?
- realm - RealmSwift 如果删除和添加 List<> 类型的对象,Realm 是如何处理这个写入的,是修改过的,还是新的写入