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

C++ 如何使用boost.thread同时运行由循环创建的多个线程?,c++,boost,boost-thread,C++,Boost,Boost Thread,我正在学习boost.thread的基本功能。到目前为止,我可以手动逐个创建每个线程,让它们同时运行。但是,当按循环创建时,它将按顺序运行,而不再是并发运行 #include <iostream> #include <boost/thread.hpp> void workerFunc() { boost::posix_time::seconds workTime(3); std::cout << "Worker: Running" << '

我正在学习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;
}
#包括
#包括
void workerFunc()
{
boost::posix_time::秒工作时间(3);
标准::cout
for(int i=0;i<2;++i)
{
boost::线程z(workerFunc);
z、 join();
}
您正在启动线程,然后立即等待它完成

编辑

除线程组之外的几种备选黑客之一

  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];
  }
std::向量z;
对于(int i=0;i<2;++i)
z、 向后推(新的boost::thread(workerFunc));
对于(int i=0;i<2;++i)
{
z[i]->join();
删除z[i];
}

好的,我通过别人的问题找到了答案,也了解了他们的问题:

使用共享的

#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';
    std::vector<std::shared_ptr<boost::thread>> z;

    for (int i = 0; i < 2; ++i) {
        z.push_back(std::make_shared<boost::thread>(workerFunc));
    }

    for (auto t : z) {
        t->join();
    }

    std::cout << "main:done" << '\n';
    return 0;
}

这在Java中也应该是一样的。在加入线程1(或纯粹主义者的线程0)之前,您不会创建线程2。对于一些调试帮助,您可以通过调用boost::this_thread::get_id()@Gracchus获得线程id。这是内存通道上的一个错误。两个不同的问题。(1)OP正在启动一个线程并立即加入(阻塞直到完成)它在一个循环中运行,因此一次只能运行一个线程。(2)OP希望将他的线程对象放入向量中。向量复制插入其中的数据,而您无法复制线程对象。因此,第二个线程通过动态创建线程并放置(复制的)线程来绕过它指向向量中线程的指针。线程对象本身不会被复制。@Gracchus阻止它的不是for循环,而是它们内部的调用。线程构造函数不会阻止。连接会阻止。t1..t4线程并行运行。他下面的for循环不会阻止它。@Gracchus我真的没有什么可添加的。给出了答案是完全正确的。这是一个解决办法,但您的编译器(最终)应该支持您最初认为要做的事情。
#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';
    std::vector<std::shared_ptr<boost::thread>> z;

    for (int i = 0; i < 2; ++i) {
        z.push_back(std::make_shared<boost::thread>(workerFunc));
    }

    for (auto t : z) {
        t->join();
    }

    std::cout << "main:done" << '\n';
    return 0;
}
# g++ e.cpp -lboost_thread && ./a.out
main: startup
Worker: Running
Worker: Running
Worker: Finished
Worker: Finished
main:done