为什么必须显式连接线程?

时间:2013-08-29 19:00:10

标签: c++ multithreading

所以这看起来非常简单:

#include <iostream>
#include <thread>

void second() {
    cout << "Don't thread on me!" << endl;
}

int main() {
    thread t { second };
    t.join();

    return 0;
    cin.get();
}

如果我不包含join(),系统会调用abort()。我不明白这个,不应该自己退出线程吗?必须加入线程似乎会使代码更难以正确封装。这有什么用?

2 个答案:

答案 0 :(得分:4)

默认情况下,线程必须加入,以便产生线程可以跟踪并等待其子项完成(例如,您将一堆工作委托给2个以上的线程,然后将它们全部加入,以便在工作完成时发出信号)。

您可以使用detach使线程从其产生线程中分离,这将导致线程独立运行。

答案 1 :(得分:4)

这是C ++线程库设计的一部分。你不需要join主题,你也可以detach。但我不建议您默认使用detach - 线程,因为这会带来一系列并发症。

与你所说的相反,我认为这不会使代码更难以封装。有不同的抽象级别,选择线程级别意味着你需要知道有线程,你需要处理它们。

对于不同的事物,您可以选择不同级别的抽象,例如:

int main() {
   auto f = std::async([](){ std::cout << "Don't tread on me\n" << std::flush; });
   f.get();      // Wait for the task to complete
}
相关问题