所以这看起来非常简单:
#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()
。我不明白这个,不应该自己退出线程吗?必须加入线程似乎会使代码更难以正确封装。这有什么用?
答案 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
}