(怎么样)我可以像这样开始多个线程:
for (i = 0; i < 10; i++) {
std::thread (myfunction, i, param2, param3);
}
没有加入?
答案 0 :(得分:10)
试试这个
for (int i = 0; i < 10; ++i) {
std::thread{myfunction, i, param2, param3}.detach();
}
或者如果您想稍后加入主题,请将它们放在std::vector
。
std::vector<std::thread> v;
for (int i = 0; i < 10; ++i) {
v.emplace_back(myfunction, i, param2, param3);
}
// Do something else...
for (auto& t : v) {
t.join();
}
答案 1 :(得分:2)
只需不要拨打join()
,detach()
。
答案 2 :(得分:0)
当然,您可以创建一些线程而无需加入它们,就像您所做的一样:
for (i = 0; i < 10; i++) {
std::thread my_thread {myfunction, i, param2, param3};
}
一旦创建线程,便开始安排其运行或等待。但是,我建议您不要这样做。
“ join”的含义是要求当前线程等待您调用join的线程。例如,
#include <iostream>
#include <thread>
using namespace std;
// A dummy function
void foo(int n)
{
cout << "This is a dummy function." << endl;
}
// Another dummy function
void bar(char c) {
cout << "This is another dummy function." << endl;
}
int main()
{
thread foo_thread(foo, 2);
thread bar_thread(bar, 'x');
foo_thread.join(); // wait for foo_thread to finish
bar_thread.join(); // wait for bar_thread to finish
return 0;
}
主线程将进入睡眠状态,直到foo_thread和bar_thread完成。
如果删除foo_thread.join()和bar_thread.join(),则主线程可能会完成并在foo和bar前返回。这将导致程序崩溃。因为在主函数的末尾,将调用foo_thread和bar_thread的析构函数,而std :: thread的析构函数将检查此线程是否可连接。如果线程未分离,则它是可连接的。如果线程是可连接的,则析构函数将调用std :: terminate(),因此您的程序将崩溃。