繁体   English   中英

boost::thread::interrupt 是做什么的?

[英]what does boost::thread::interrupt do?

以下代码仅打印一次Inside Thread function

#include <iostream>
#include <boost/thread.hpp>
using namespace std;


void thread_fn() {
    while (true) {
        std::cout << "Inside thread function\n";
        boost::this_thread::sleep_for(boost::chrono::seconds(1000));
    }
}

int main() {
    boost::thread bt(thread_fn);
    while (true) {
        boost::this_thread::sleep_for(boost::chrono::seconds(1));
        bt.interrupt();
    }
    bt.join();
    return 0;
}

但它与以下 function 一起工作正常

void thread_fn() {
    while (true) {
        try {
            std::cout << "Inside thread function\n";
            boost::this_thread::sleep_for(boost::chrono::seconds(1000));
        } catch (boost::thread_interrupted&) {
            std::cout << "Interrupt received" << std::endl;
        }
    }
}

官方文件说以下行

当被中断的线程下一次执行指定的中断点之一(或者如果它当前在执行一个中断时被阻塞)并启用中断,那么将在被中断的线程中抛出 boost::thread_interrupted 异常。 如果没有被捕获,这将导致被中断线程的执行终止。 与任何其他异常一样,堆栈将被展开,并且将执行自动存储持续时间的对象的析构函数。

如果未处理的异常导致被中断线程的执行终止,为什么程序没有崩溃并退出main()中的后续循环

while (true) {
        boost::this_thread::sleep_for(boost::chrono::seconds(1));
        bt.interrupt();
    }

如果未处理的异常导致被中断线程的执行终止,为什么程序没有崩溃并退出 main() 中的后续循环

仅仅是因为 Boost.Thread 就是这样设计的。

他们已经做到了, interrupt()将引发异常,并且未能捕获异常会终止线程(但不是进程)。

文档中的任何内容,无论是您引用的内容还是可以在其他地方找到的内容,都没有说明您的程序应该会崩溃。


文档中

可以通过调用相应 boost::thread object 的 interrupt() 成员 function 来中断正在运行的线程。 当被中断的线程下一次执行指定的中断点之一(或者如果它当前在执行一个中断时被阻塞)并启用中断,那么将在被中断的线程中抛出 boost::thread_interrupted 异常。 如果没有被捕获,这将导致被中断线程的执行终止。

和:

如果传递给 boost::thread 构造函数的 function 或可调用 object 在调用时传播了一个非 boost::thread_interrupted 类型的异常,则调用 std::terminate()。

大概他们只是在调用线程入口点的代码中捕获了这种异常,然后安全返回,结束线程。 因此,尽管没有处理异常,但就 C++ 而言,它不是未处理的异常

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM