2011-02-02 55 views
2

所以我有類似如何在新的單獨線程中從矢量運行每個函數?

typedef boost::function<void(DataType)> Function; 
typedef std::vector<Function>  FunctionSequence; 
typedef typename FunctionSequence::iterator FunctionIterator; 


DataType* dataElement; 
FunctionSequence funcs; 
    //... 
    for (FunctionIterator it(funcs.begin()); it != funcs.end(); ++it){ 
     DataType dataCopy; 
     dataCopy = *dataElement; 
     (*it)(dataCopy); 

如何使用boost.thread使單獨的新線程或者如果每個向量函數運行其最好有螺紋的載體,這樣不會創建therad每一次?

+0

不知道你是要完成的任務。你能否提供更多細節?你是否試圖在同一個DataType實例上執行每個函數?如果是這樣,函數是否會修改DataType的值?謝謝 – skimobear 2011-02-02 02:31:34

回答

4

如果你正在試圖做的是推出一個新的線程爲每個功能,並通過在你的數據類型對象的副本是什麼,你要使用Boost ThreadsBoost Bind

#include <boost/function.hpp> 
#include <boost/bind.hpp> 
#include <boost/thread.hpp> 

boost::thread_group tg; 

for (FunctionIterator it(funcs.begin()); it != funcs.end(); ++it) 
{ 
    tg.create_thread(boost::bind(*it, *dataElement)); 
} 

tg.join_all(); 

首先,您創建一個boost::thread_group,它將作爲您啓動的所有線程的容器。然後create_thread將啓動一個新線程並調用傳遞給它的函數。在這種情況下,我們想要調用的不僅僅是一個簡單的函數,所以我們需要使用boost::bind來創建一個線程可以運行的函數void()。對boost::bind的調用首先指定要調用的函數,然後指定傳遞給函數的任何參數。它已經複製了參數,所以沒有必要事先創建另一個副本。

啓動所有線程後,可以調用tg.join_all()等待所有線程完成後再繼續。調用join_all()是非常重要的,並確保線程不會在後臺運行流氓。

顯然,如果你有很多的功能,打電話,不希望多線程創建的,你必須追蹤優秀的線程數,只有創造新的,一旦現有的線程退出。這需要在被調用的函數內部額外保留一些書本(並可能涉及封裝函數)。你的情況可能不需要。

相關問題