为什么提升::屏障等待不是中断点
why is boost::barrier wait not an interruption point?
调用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()
),它们的sleep
和pthread_cond_wait
也被信号终止。虽然这里的一个例外是 boost::thread::join()
,这是一个中断点,而pthread_join
处理信号后继续等待。
- 无法删除指针,已触发断点
- 条件断点在不应该触发时触发
- 类成员和中断
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 我的代码运行良好,但在游戏循环中中断
- 使用带有MCP23017的 pigpio 进行中断读取
- 为什么我在 AVR 中的中断无法正常工作?
- GDB 断点在 Mac 上是不准确的
- 使用 UDP 中断 while()-循环
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何在 CompleteAsyncIO 中访问 IOMemoryBufferDescriptor,该描述符通过中断 EP
- 如何为伺服电机创建中断或返回值?
- 开关:无外壳中断
- 如何使用中断停止循环?
- 在 vscode 中运行时无法暂停或设置断点
- 为什么当我输入一个被接受的数字时,我的 do-while 循环没有中断?
- 在 Ubuntu 中编译 SuiteSparse,在安装 CHOLMOD 时中断
- Visual Studio在调试时随机在启动时中断断点
- 为什么代码在代码块中的断点处没有中断
- 断点安装失败:中断失败