如何使用boost.thread同时运行循环创建的多个线程?

Amu*_*umu 2 c++ boost boost-thread

我正在学习boost.thread的基础知识.到目前为止,我可以手动逐个创建每个线程,让它们同时运行.但是,在通过循环创建时,它会依次运行而不是并发运行.

#include <iostream>
#include <boost/thread.hpp>
void workerFunc()
{
  boost::posix_time::seconds workTime(3);
  std::cout << "Worker: Running" << '\n';
  boost::this_thread::sleep(workTime);
  std::cout<< "Worker: Finished" << '\n';
}

int main()
{
  std::cout << "main: startup" << '\n';
  boost::thread workerThread(workerFunc);
  std::cout << "main: waiting for thread" << '\n';
  //these are ok
  boost::thread t(workerFunc), t2(workerFunc), t3(workerFunc), t4(workerFunc);     
  t.join();
  t2.join();
  t3.join();
  t4.join();
  //these are not
  for (int i = 0; i < 2; ++i)
    {
      boost::thread z(workerFunc);
      z.join();
    }
  std::cout << "main:done" << '\n';
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Duc*_*uck 14

  for (int i = 0; i < 2; ++i)
    {
      boost::thread z(workerFunc);
      z.join();
    }
Run Code Online (Sandbox Code Playgroud)

你正在开始你的线程,然后立即等待它完成!

编辑

除线程组之外的几种替代黑客之一.

  std::vector<boost::thread *> z;

  for (int i = 0; i < 2; ++i)
    z.push_back(new boost::thread(workerFunc));

  for (int i = 0; i < 2; ++i)
  {
      z[i]->join();
      delete z[i];
  }
Run Code Online (Sandbox Code Playgroud)

  • @Gracchus沿记忆路走下去.两个单独的问题.(1)OP正在启动一个线程并立即加入(阻塞直到完成)它在一个循环中,因此一次只能运行一个线程.(2)OP想把他的线程对象放在一个向量中.向量会复制插入其中的数据,您无法复制线程对象.所以第二个通过动态创建线程并将(复制的)*指针*放到向量中的线程来绕过它.线程对象本身不会被复制. (2认同)
  • @Gracchus阻止它的for循环不是它们内部的调用.线程构造函数不会阻塞.加入确实如此. (2认同)