【问题标题】:When using boost::thread::interrupt(), do you *need* to catch the thread_interrupted exception?当使用 boost::thread::interrupt() 时,你*需要*捕获 thread_interrupted 异常吗?
【发布时间】:2011-09-16 12:52:05
【问题描述】:

我有几个长时间运行的 boost 线程,我希望能够通过中断它们来关闭它们。我能找到的所有文档都说你可以捕获thread_interrupted 异常,但并没有真正说明如果你不这样做会发生什么。 我会假设它会杀死线程(并希望线程得到正确清理)。但是,异常会随着线程而消失吗?还是它会被传递到主线程并杀死它?

【问题讨论】:

    标签: c++ multithreading boost boost-thread


    【解决方案1】:

    该异常与任何其他 C++ 异常一样。如果您选择不捕获它,它将导致与任何其他未处理异常相同的效果。

    如果不被捕获,它不会传播到主线程,但可能会导致其他不良行为。例如,在 Visual C++ 上,默认情况下这将是 terminate your process

    通常,防御性编程实践要求您捕获代码可能抛出的任何异常 - 就像您从调用的 OS API 检查错误一样。

    编写大量 Boost.Thread 代码的人有一个关于中断here 的背景资料。

    【讨论】:

    • 嗯。我当然没有意识到让异常冒泡可以在某些环境中终止整个过程(我们的情况并非如此)。谢谢
    • @Tomalak - 我想这 100% 取决于编译器。
    • 我的一个同事做了一个测试,结果表明中断线程,不处理异常,不会终止进程。这通过 Linux 机器上的 GCC 和 Windows 机器上的 VC++ 都得到了证实。我已经阅读了您链接的文档,但这并没有具体说明线程结束并清理后会发生什么。
    • @Rob - 同意在这种情况下缺乏行为细节。我的看法是,能扔的,就应该处理。这样您就不必依赖最佳猜测,您可以控制线程的命运,并且可以在中断时在每个目标平台上完全关闭它。有趣的是,您的测试信息似乎与 VC++ 文档相矛盾。更有理由不依赖未处理异常的行为?
    • 我完全同意。我很惊讶环境会在这种情况下终止整个过程,但是这里有足够多的歧义来完全排除这种可能性。 @RobW:两个测试对一般行为没有结论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    相关资源
    最近更新 更多