gpt4 book ai didi

c++ - 使用 shared_ptr 在中断时结束多线程循环

转载 作者:行者123 更新时间:2023-11-28 04:32:57 25 4
gpt4 key购买 nike

因此,当我中断一个程序(使用 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 标准中,如果你可以依赖的话。

关于c++ - 使用 shared_ptr 在中断时结束多线程循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52395474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com