当前位置: 首页 > 知识库问答 >
问题:

运行线程与线程对象的关系

陆宏扬
2023-03-14

在学习基本的线程管理时,我发现很难理解书中的这些行(粗体)。

一旦您启动了线程,您需要明确地决定是等待它完成(通过与它连接--参见第2.1.2)还是让它自己运行(通过分离它--参见第2.1.3)。如果在std::Thread对象被销毁之前没有做出决定,那么程序将被终止(std::Thread析构函数调用std::Terminate())。因此,即使存在异常,也必须确保线程正确连接或分离。有关处理此场景的技术,请参见第2.1.3节。请注意,您只需在Std::thread对象被销毁之前做出此决定--线程本身很可能在您与它联接或分离它之前很久就已经完成了,如果您分离它,那么线程可能会在Std::thread对象被销毁后很久继续运行。

即使在线程对象被销毁后,线程何时运行?有人有样例代码或任何参考吗?

共有1个答案

薛保臣
2023-03-14

这意味着线程的生存期与thread对象的生存期无关。

所以下面的代码:

#include <thread>
#include <iostream>

int main() {
    { //scope the thread object
        std::thread thr = std::thread([]() {
            std::this_thread::sleep_for(std::chrono::seconds(1));
            std::cout << "Thread stuff\r\n";
        });
        thr.detach();
    } //thr is destroyed here
    std::cout << "thr destroyed, start sleep\r\n";
    std::this_thread::sleep_for(std::chrono::seconds(10));
    std::cout << "sleep over\r\n";
}

将输出:

thr destroyed, start sleep
Thread stuff
sleep over
 类似资料:
  • 问题内容: Python中的和模块之间有什么区别? 问题答案: 在Python 3中,已重命名为。它是用于实现的基础结构代码,普通的Python代码不应该靠近它。 公开了底层操作系统级别流程的原始视图。这几乎绝不是您想要的,因此在Py3k中重命名以表明它实际上只是实现细节。 添加了一些额外的自动记帐功能,以及一些便捷实用程序,所有这些使它成为标准Python代码的首选。

  • 我已经面临这个问题很多天了,请帮我解决。我正在使用线程同步实现生产者-消费者示例。我在这个传统节目中做了一些调整。我没有只使用一个队列对象,而是使用了两个队列对象。但程序不起作用。。(PS-我知道我可以通过只使用队列的一个对象来让这个程序工作,但如果我想使用两个队列对象呢??) 类队列{ } 类生产者实现Runnable{ } 类消费者实现可运行{ } 公共类测试队列{ }

  • 问题内容: 目的是能够从 主类中* 调用 单独线程的 执行。 * 一些上下文:我有一个必须运行 进程的程序 。仅当主程序执行完毕并从内存中卸载时,该进程 (一个cmd程序)才 应运行。 我应该在 主类中 包括哪些代码? 问题答案: 如果您的意思是: 如何启动一个Java线程,当我的JVM(Java程序)运行时,该线程不会结束? 。 因为在Java中,如果JVM退出,则所有线程均已完成。这是一个例子

  • 问题内容: 我有一个正在运行的线程,但是从外面我无法绕过一个值来停止该线程。如何在内部发送false / true值或调用运行线程的公共方法?当我按下按钮1?例如: 或 跟进(校对): 问题答案: 如果您通过类而不是通过a定义它,则可以调用实例方法。 还要注意,由于多个内核具有自己的关联内存,因此您需要警告处理器该状态可能在另一个处理器上更改,并且它需要监视该更改。听起来很复杂,但只需将’vola

  • 问题内容: 看起来我已经搞砸了Java线程/ OS线程和解释性语言。 在开始之前,我确实了解绿色线程是Java线程,其中JVM处理线程,并且整个Java进程仅作为单个OS线程运行。因此,在多处理器系统上是没有用的。 现在我的问题是。我有两个线程A和B。每个线程都有10万行独立代码。我在多处理器系统上的Java程序中运行这些线程。每个线程都将被赋予一个本机OS线程来运行,该线程可以在不同的CPU上运

  • 我有一堆运行程序,我想通过线程池来执行。然而,每个运行程序也会将一些结果写入一些文件。所以现在,运行程序的界面很简单: 然而,我想要的是将一个BufferedWriter(换句话说,一个输出文件)与Executor池中的每个线程相关联。但是,我正在调用功能,如下所示: 我不知道执行器将分配哪个线程来运行给定的任务,所以我不知道应该向runnable提供哪个BufferedWriter。如何确保Ex