为什么boost :: barrier等不是中断点?

时间:2012-07-05 20:17:03

标签: c++ multithreading boost synchronization interrupt-handling

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

这有充分的理由吗?

当然我们可以手动放置一个boost :: this_thread :: interruption_point()来处理它。

1 个答案:

答案 0 :(得分:1)

如果在当前线程上设置了中断标志并且该行为与暂停线程和调用中断处理程序根本不同,则增加中断点会抛出异常。 boost中的锁都不是中断点,它遵循pthread锁的行为;当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在处理信号后仍在等待。