如何使用boost.thread同时运行由循环创建的多个线程?
问题描述:
我在学习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;
}
答
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];
}
答
好,我找到了答案通过别人的问题一样,以及学习他们的问题:
How to make boost::thread_group execute a fixed number of parallel threads
+0
这是一个解决方法,但是你的编译器应该(最终)支持你最初的想法。 – Duck 2011-06-02 15:03:10
所以我想我应该把所有的线程在循环中的容器,并在稍后用另一个循环运行它?那么,我试图按照我通常在Java中所做的那样去做。 – Amumu 2011-06-02 14:20:26
这在Java中也应该采用相同的方式。在您已经加入线程#1(或纯化论者的线程#0)之前,您并未创建线程#2。对于某些调试帮助,您可以通过调用boost :: this_thread :: get_id() – Jan 2011-06-02 14:26:44
来获取线程ID。如何将它放入容器中?它不允许我将boost :: thread对象放入容器中。 – Amumu 2011-06-02 14:44:53