【问题标题】:C++ Declare same thread variable multiple times (in a loop)C ++多次声明相同的线程变量(在循环中)
【发布时间】:2020-05-07 21:37:35
【问题描述】:

我想知道如果我这样做会发生什么:

void afunction(/*parameters*/) { /*do something*/ }

// And then in main... 

while(1) {
    thread aThread(afunction, /*parameters*/);
    athread.detatch();
    sleep(1);
}

这是否会创建无限数量的线程(直到系统崩溃)?或者它会在 1 秒后覆盖旧线程(比如杀死线程并创建一个新线程)?我有什么需要担心的问题吗?

【问题讨论】:

    标签: c++ multithreading thread-safety


    【解决方案1】:

    前者。

    特别是,当控制进入 while-loop-body 的作用域时,thread 对象 aThread 被创建,并由它的构造函数生成一个新的 OS 线程(注意我在这里假设你正在使用 @ 987654323@ 而不是其他线程类)。

    然后您在线程对象上调用detach(),因此操作系统线程不再与aThread 对象关联,但它仍在运行。

    然后在延迟一秒后,到达作用域的末尾,因此aThread 对象被销毁,但由于操作系统线程与aThread 对象分离,操作系统线程留给继续自行运行。

    然后再次进入作用域进行下一次while循环的迭代,整个过程无限重复。

    一般来说,最好在你的线程上调用join() 而不是detach(),因为这样可以让你的程序进行有序的关闭。如果没有join(),就很难或不可能安全地拆除进程范围的资源,因为您不能保证在拆除发生时仍在运行的线程可能不在使用这些资源。因此,大多数编写良好的多线程程序将在所有当前运行的线程上调用join(),就在main() 结束之前,如果不是更早的话。

    【讨论】:

    • 请注意,当使用std::thread 时,分离的操作系统线程会在停止运行时自行清理,因此它不会不必要地占用操作系统资源。在调用std::thread::join() 之前,不会清理未分离的操作系统线程。如果操作系统线程在调用join() 之前停止运行,则该线程将处于空闲状态,占用操作系统资源。
    • 谢谢!作为以下问题 - 在我的应用程序中,我想在线程内运行一个无限循环,因此我无法使用std::thread::join(),但如果一切正常,这对我来说不是问题。现在-如果我启动std::thread,不要调用std::thread::join(),也不要调用std::thread::detach(),我的应用程序会在最后出现错误而终止。但是,当我的应用程序在执行中途崩溃时会发生什么?线程也会被破坏吗?
    • 如果你的应用程序崩溃了,它的所有线程都会被操作系统杀死(不管你是否调用了detach()),所有的内存和资源都会被释放。 (不是说你应该让你的应用程序崩溃:))
    • 谢谢!你帮了我很多:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2011-03-21
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多