【问题标题】:How to detect if a thread is active如何检测线程是否处于活动状态
【发布时间】:2012-01-27 00:13:20
【问题描述】:

使用 MS VC++ 和 Boost 线程,我在主线程中有一个例程 - 实际上是一个 Windows 过程 - 被多次调用。在每次调用中,例程都会创建一个新线程 - 我计划通过 new 将线程对象创建到持久空间中,并将结果附加到全局 -static-pointer-。如果在下一次调用重例时,前一个线程仍在运行,我需要终止前一个线程。

我读过:“正如文件的生命周期可能与代表文件的 iostream 对象的生命周期不同,执行线程的生命周期可能与代表线程的线程对象不同执行。特别是,在调用 join() 之后,执行线程将不再存在,即使线程对象继续存在直到其正常生命周期结束。反之亦然;如果线程对象被销毁而没有join() 首次被调用后,执行线程将继续执行,直到其初始函数完成”。

在重新发明轮子之前,问题是:是否有标准方法来检测线程是否仍在运行?在这种情况下:终止它的规范方法是什么?

提前致谢。

【问题讨论】:

    标签: windows visual-c++ boost-thread


    【解决方案1】:

    结束线程的规范方法是通过joininterrupt,具体取决于线程的具体用途。 据我所知,没有一个函数可以返回线程是否仍在运行,但是您可以尝试使用 0 等待时间调用 timed_join

    返回:

    如果 *this 指的是进入时执行的线程,并且该执行线程在调用超时之前已完成,则为 true,false 否则。

    【讨论】:

    • 尽管有待检查,timed_join 方法应该足够了。关于join,据我所知,只是将主线程保留到新的结束,所以我必须使用interrupt -我想-
    【解决方案2】:

    使用@987654321@ 方法怎么样?

    如果 *this 指的是执行线程,则返回 true,否则返回 false。

    有两种方法可以终止线程:join 更简洁一些,也可以调用detach

    【讨论】:

    • 我认为对于join 的语义存在一个常见的误解。如果我理解正确,join 实际上并没有终止线程,而是保持主线程直到新线程自行终止。关于joinable肯定会为上述提议服务。关于detach我必须承认,对于“执行线程分离”的含义还不清楚。
    • 没错,你想阻塞就加入线程,直到线程执行完毕。通常你会等待某种结果,等等。但是,如果你不再关心线程的状态,你可以调用 detach,它允许它继续运行直到它自然结束,即它应该只携带一直在做它正在做的事情,直到它完成,但你不会等待任何结果,即你的程序可以在不知道线程在做什么的情况下继续。
    • 感谢您对 detach 选项的清晰解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2020-07-10
    • 2020-01-11
    相关资源
    最近更新 更多