无需加入就启动多个线程

时间:2014-01-31 11:29:27

标签: c++ multithreading c++11

(怎么样)我可以像这样开始多个线程:

for (i = 0; i < 10; i++) {
   std::thread (myfunction, i, param2, param3);
}

没有加入?

3 个答案:

答案 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(),因此您的程序将崩溃。