为什么提升::屏障等待不是中断点

why is boost::barrier wait not an interruption point?

本文关键字:中断 断点 等待 为什么      更新时间:2023-10-16

调用boost::thread Interrupt()时,等待boost::barrier wait()的线程不会被中断。http://www.justsoftwaresolutions.co.uk/threading/thread-interruption-in-boost-thread-library.html

这有什么充分的理由吗?

当然,我们可以手动放置一个 boost::this_thread::interruption_point() 来解决这个问题。

如果在当前线程上设置了中断标志,并且行为与挂起线程和调用中断处理程序根本不同,则 Boost 中断点将引发异常。提升中的两个锁都不是中断点,它遵循线程锁的行为;当 pthread 锁定在等待时被信号处理程序中断时,它会在处理程序完成时继续等待。以同样的方式,如果您将提升线程标记为中断,boost::mutex::lock()boost::barrier::wait()将继续等待。

另一件事是,如果您允许barrier::wait()过早返回而不获取锁,则必须在引发异常之前从等待屏障的线程池中注销当前线程,这将使实现更加复杂。它还允许锁定/等待方法在不获取锁的情况下返回,这也会使您的代码更加复杂。

一般来说,我认为这只是一种设计选择。

如果你看一下作为中断点的方法,你会发现它们通常意味着休眠时间更长(boost::this_thread::sleep()boost::condition_variable_any::wait()),它们的sleeppthread_cond_wait也被信号终止。虽然这里的一个例外是 boost::thread::join() ,这是一个中断点,而pthread_join处理信号后继续等待。