【问题标题】:How to run multiple threads created by loop simultaneous using boost.thread?如何使用 boost.thread 同时运行由循环创建的多个线程?
【发布时间】:2011-09-07 02:45:14
【问题描述】:

我正在学习 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;
}

【问题讨论】:

    标签: c++ boost boost-thread


    【解决方案1】:
      for (int i = 0; i < 2; ++i)
        {
          boost::thread 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];
      }
    

    【讨论】:

    • 这在 Java 中也应该如此。在您加入线程#1(或纯粹主义者的线程#0)之前,您不会创建线程#2。对于一些调试帮助,您可以通过调用 boost::this_thread::get_id() 来获取线程 ID
    • @Gracchus 一段记忆之旅。两个不同的问题。 (1) OP 正在启动一个线程并立即加入(阻塞直到它完成)它在一个循环中,因此一次只能运行一个线程。 (2) OP 想把他的线程对象放在一个向量中。向量复制插入其中的数据,您不能复制线程对象。所以第二个通过动态创建线程并将(复制的)指针指向向量中的线程来绕过它。线程对象本身不会被复制。
    • @Gracchus 阻止它的不是 for 循环,而是它们中的调用。线程构造函数不会阻塞。加入确实如此。
    • t1..t4 线程并行运行。他的以下 for 循环没有。
    • @Gracchus 我真的没有什么要补充的。给出的答案完全正确。
    【解决方案2】:

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

    How to make boost::thread_group execute a fixed number of parallel threads

    【讨论】:

    • 这是一种变通方法,但您的编译器应该(最终)支持您最初的想法。
    【解决方案3】:

    使用 shared_ptr

    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多