2011-12-08 2 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