2011-05-13 5 views
2

현재 코어 수와 동일한 스레드 수의 부스트 스레드 풀을 사용하고 있습니다. 스케줄을 잡았습니다. 풀의 일정 기능을 사용하는 10 개의 작업을 말합니다. 예를 들어, 내가 기능스레드 풀을 사용한 멀티 스레딩

void my_fun(std::vector<double>* my_vec){ 
    // Do something here 
} 

여기에 그냥 일시적인 계산을 수행하는 데 사용되는 인수 'my_vec'을 가지고 가정합니다. 함수를 전달하는 주요 이유는 함수를 다시 호출 할 때이 벡터를 다시 사용하고 싶다는 것입니다.

현재, 나는 다음과 같은

// Create a vector of 10 vectors called my_vecs 

// Create threadpool 
boost::threadpool::pool tp(num_threads); 

// Schedule tasks 
for (int m = 0; m < 10; m++){ 
    tp.schedule(boost::bind(my_fun, my_vecs.at(m))); 
} 

이 내 문제가 : 만 2 벡터 10 개 벡터의 벡터를 대체하고 싶습니다. 10 개의 작업을 예약하고 2 개의 코어가있는 경우 언제든지 최대 2 개의 스레드 (작업)가 실행됩니다. 그래서 나는 단지 두 개의 벡터 (하나는 각 스레드에 할당 됨)를 사용하고 10 개의 작업을 수행하는 데에만 사용하고자합니다. 어떻게해야합니까?

분명히하는 것이 좋겠습니다. 고맙습니다!

+0

어쩌면 http://stackoverflow.com/questions/3344028/how-to-make-boostthread-group-execute-a-fixed-number-of-parallel-threads가 도움이 될까요? – sarnold

답변

1

아마도 boost::thread_specific_ptr이 필요합니다. 다음은 함수에서 사용할 수있는 방법입니다.

#include <boost/thread/tss.hpp> 
boost::thread_specific_ptr<std::vector<double> > tls_vec; 

void my_fun() 
{ 
    std::vector<double>* my_vec = tls_vec.get(); 
    if(!my_vec) { 
     my_vec = new std::vector<double>(); 
     tls_vec.reset(my_vec); 
    } 
    // Do something here with my_vec 
} 

동일한 스레드로 예약 된 작업간에 벡터 인스턴스가 다시 사용됩니다. 풀에 더 많은 스레드가있는 경우 2 개 이상의 인스턴스가있을 수 있지만 다른 대답에서 언급 된 선점 때문에 실제로 코어 당 실행중인 스레드 당 인스턴스가 필요합니다.

thread_specific_ptr에 저장된 벡터 인스턴스를 삭제하지 않아도됩니다. 해당 스레드가 완료되면 자동으로 삭제됩니다.

0

동시에 두 개의 스레드 만 예약 할 수있는 두 가지가 있지만 많은 스레드 시스템에서는 스레드가 시간 분할되어 스레드가 해당 작업을 실행하는 동안 선취됩니다. 따라서 세 번째 (네 번째, ...) 스레드는 첫 번째와 두 번째의 처리가 여전히 불완전한 동안 작업 할 수있는 기회를 얻습니다.

이 특정 스레딩 구현에 대해서는 잘 모릅니다 만, 선점 형 스케줄링을 허용하거나 지원하는 환경에서 실행됩니다. 스레드에 대한 내 사고 방식은 각 스레드가 고유 한 자원을 갖도록 간단하게 유지하려고 시도하는 것입니다.

1

스레드 수를 코어 수로 제한하지 않겠습니다. 멀티 - 쓰레드 프로그래밍은 멀티 코어 프로세서를 사용하기 오래 전에 계속 진행되어 왔습니다. 이는 스레드가 일부 리소스에 대해 차단 될 가능성이 높으며 다음 스레드가 CPU를 사용하여 점프 할 수 있기 때문입니다.

+0

소프트웨어 스레드 전환이 비쌉니다. 일반적으로 대부분의 리소스가로드 될 때까지 대기하는 것 이상의 방법입니다 (단일 코어에서 성능상의 이유로 멀티 스레딩을하지 않은 경우 멀티 태스킹이었습니다).우리가 때때로 단일 코어에 여러 하드웨어 _ 스레드를 갖는 이유에 대해 설명합니다. – Bahbar

+0

나는 동의하지 않는다. 때로는 더 비쌀 수도 있지만, 나는 그것이 전형적이라고 의견이 다르다. 신청서 기준으로 신청서를 평가해야합니다. 단일 코어의 여러 스레드가 확실하게 성능을 향상시킬 수 있다고 믿습니다. 특히 하나의 스레드가 UI 상호 작용을 담당 할 때 예를 들어, Apple에는 [NSOperations for iPhone apps] (http://www.icodeblog.com/2010/03/04/iphone-coding-turbo-charging-your-apps-with-nsoperation/)이 포함되어 있습니다. iPhone은 단일 코어이지만 Apple은 여러 스레드를 필요로합니다. –

+1

나는 진술이 지나쳤다는 것에 동의한다. (그리고 당신의 UI 예제는 좋은 것이다.) 하지만 계산 전용입니까? 그것이 저의 질문과 같습니다. – Bahbar