2011-12-08 23 views
0

我有一些工作需要在单独的线程中完成,工作是在对象的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>>并通过它们并通过我的对象向量进行循环?

回答

3

您需要使用线程池。 Boost可能会提供一个,但我认为它没有。 PPL和TBB在它们的parallel_for_each函数中提供它们。

松散地说,Boost提供的thread_group类应该是你需要的。

基本上,boost::thread是OS线程上的包装,它并不是一个真正的线程基础。 PPL和TBB提供并行算法和数据结构,这要好得多。

+0

我第二个这个。如果你能够使用C++ 11,你可能也想看看那里的并发性东西。 – LiMuBei