我有一些工作需要在不同的线程中完成,工作是在std::vector<T>
个对象上完成的。
我需要完成工作,然后在主线程中等待join()
的所有线程。
我已经通过以下方式完成了这项工作,但我认为这不是一个好主意,因为我只有一个指针,它指向循环的每次迭代的其他内容。
struct properties
{
explicit properties(someobj obj) : obj_(obj) {}
void operator()() { /*do something*/ }
someobj obj_;
};
boost::shared_ptr<boost::thread> t;
for (size_t tst = 0; tst <= myvector.size() - 1; ++tst)
{
properties props(myvector[tst]);
t = boost::shared_ptr<boost::thread>(new boost::thread(props));
}
//get main thread to wait till all t's are done, however is this a smart way to wait on multiple t's?? Which t is it going to wait on?
t->join();
有人可以提出更好的方法吗?我应该制作一个vector<boost::shared_ptr<boost::thread>>
并循环浏览它们并通过我的对象向量吗?
答案 0 :(得分:3)
您需要使用线程池。 Boost可能提供一个,但我不认为它。 PPL和TBB在parallel_for_each
函数中提供它们。
松散地,Boost提供的thread_group
课程应该是您所需要的。
从根本上说,boost::thread
是OS线程的包装器,它并不是一个真正的线程基础。 PPL和TBB提供并行算法和数据结构,这要好得多。