我正在研究libstdc ++代码,当operator>>
或operator<<
被pthread
的取消点(如果我理解正确)中断时it sets the badbit on a stream感到惊讶,通过抛出一个特殊的魔术异常对象来实现)。
显然,C ++标准要求转义到相应I / O函数的异常应设置badbit。但据我了解,pthread取消并不需要被视为&#34;异常&#34;在C ++意义上。
这是否意味着在调用pthread_cancel
使用cout
和朋友的线程时,总是必须在执行I / O退出的线程之后清除badbit(是确定以防线程导致badbit被设置)?
答案 0 :(得分:1)
C ++标准没有为pthread的特殊异常指定任何特定行为。但是,它指定捕获任何异常都会导致设置std::ios_base::badbit
。需要对标准进行扩充以处理特殊的特殊异常。在C ++标准中,独立于C ++的不同标准之间的相互作用显然不在C ++标准之内。
在一次Kona会议上(~2006 / 2007),详细讨论了通过例外取消线程的问题。确定支持线程取消会导致奇怪的问题,并且在C ++中有太多问题需要支持线程取消。如果你想在C ++中使用工作线程析取支持,你需要将它与C ++标准集成。不过,我不希望在C ++中对线程取消给予大量支持。
对于更实际的问题,我还可以想象从例如read(2)
中抛出可能会使不知情的I / O流实现流处于不一致状态!系统功能并没有用来投掷。如果开始做这么有趣的事情可能会发生。也就是说,stabdard库需要知道系统调用行为的这种变化。这种行为的无声改变是为什么通过异常删除线程并不被认为是一种可行的方法的原因之一:适用于标准C ++库实现的内容更适用于用户代码。