2011-06-02 30 views
1

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

回答

13
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]; 
    } 
+0

所以我想我应该把所有的线程在循环中的容器,并在稍后用另一个循环运行它?那么,我试图按照我通常在Java中所做的那样去做。 – Amumu 2011-06-02 14:20:26

+1

这在Java中也应该采用相同的方式。在您已经加入线程#1(或纯化论者的线程#0)之前,您并未创建线程#2。对于某些调试帮助,您可以通过调用boost :: this_thread :: get_id() – Jan 2011-06-02 14:26:44

+0

来获取线程ID。如何将它放入容器中?它不允许我将boost :: thread对象放入容器中。 – Amumu 2011-06-02 14:44:53