2011-02-02 5 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

답변

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()을 호출하는 것은 매우 중요하며 스레드가 백그라운드에서 불량배를 실행하지 않도록합니다.

호출 할 함수가 많고 많은 스레드를 생성하지 않으려면 처리되지 않은 스레드의 수를 추적하고 기존 스레드가 종료되면 새 스레드를 생성해야합니다. 이것은 불려지는 함수 안에 몇개의 여분의 책을 필요로 할 것이다. 그것은 아마도 귀하의 경우에는 필요하지 않습니다.

관련 문제