5

所以这看起来很简单:

#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(). 我不明白这一点,线程不应该自行退出吗?必须加入线程似乎会使代码更难正确封装。这有什么关系?

4

2 回答 2

4

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

与您所说的相反,我认为这根本不会使代码更难封装。有不同的抽象级别,选择线程级别意味着您需要意识到有线程并且您需要处理它们。

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

int main() {
   auto f = std::async([](){ std::cout << "Don't tread on me\n" << std::flush; });
   f.get();      // Wait for the task to complete
}
于 2013-08-29T19:09:36.480 回答
4

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

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

于 2013-08-29T19:03:12.697 回答