gpt4 book ai didi

c++ - 为什么取消 istream/ostream 的 IO 函数中的 pthread 会设置 badbit?

转载 作者:太空狗 更新时间:2023-10-29 23:04:30 26 4
gpt4 key购买 nike

我正在研究 libstdc++ 代码并且很惊讶 it sets the badbit on a streamoperator>>operator<<pthread 的取消点打断(如果我理解正确的话,它是通过抛出一个特殊的魔法异常对象来实现的)。

显然,C++ 标准要求转义到相应 I/O 函数的异常应设置 badbit。但据我了解,不需要将 pthread 取消视为 C++ 意义上的“异常”。

这是否意味着在调用 pthread_cancel 时'ing 一个使用 cout 的线程和 friend 们,总是必须在执行 I/O 的线程退出后清除 badbit(以防万一线程导致 badbit 被设置)?

最佳答案

C++ 标准没有为 pthread 的特殊异常指定任何特定行为。但是,它指定捕获任何异常都会导致设置 std::ios_base::badbit。需要扩充该标准以处理特殊的异常情况。在 C++ 标准中独立于 C++ 的不同标准之间的交互显然在 C++ 标准之外。

在一次 Kona session 上(~2006/2007),详细讨论了通过异常取消线程。确定支持线程取消会导致奇怪的问题,并且在 C++ 中支持线程取消的问题太多。如果您想在 C++ 中支持工作线程取消调用,则需要将其与 C++ 标准集成。不过,我不希望在 C++ 中大量支持线程取消。

对于更实际的问题,我还可以想象从例如 read(2) 中抛出可能会使毫无戒心的 I/O 流实现的流处于不一致的状态!系统函数没有用来抛出。如果一开始就这样做,可能会发生有趣的事情。也就是说,stabdard 库需要知道系统调用行为的这种变化。这种行为上的无声变化是为什么通过异常取消线程不被认为是可行方法的论点之一:适用于标准 C++ 库实现的内容更适用于用户代码。

关于c++ - 为什么取消 istream/ostream 的 IO 函数中的 pthread 会设置 badbit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22737484/

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