2013-04-09 2 views
3

std::async을 여러 번 호출하는 프로그램이 있습니다. 실행되는 작업은 적당히 짧습니다 (각각 수 백 밀리 초와 같습니다). 스레드 생성에 상당한 오버 헤드가 있다는 것을 알 수 있습니다. 어떻게 든이 문제를 피할 수 있을지 궁금합니다. 작업을 열거하는 코드는 작업 처리보다 훨씬 빠르게 실행됩니다. 그러므로 나는 이미 일종의 풀링을하고있다. 그것은 이렇게 간다.스레드 풀로 많은 std :: async 호출 바꾸기

template <typename T> 
struct job { 
    std::future <void> fut; 
    std::vector <T*> *result; 
    bool inUse; 
} 

병렬 코드가 시작되기 전에 작업 벡터 배열을 초기화하여 결과 벡터를 한 번만 생성합니다. 그런 다음 작업 열거 코드가 작업을 열거 할 때마다 사용되지 않는 작업 슬롯을 찾습니다. 빈 슬롯이 있으면 새로운 작업을 시작 (std :: async)하고 슬롯을 앞으로 옮깁니다. 작업이 실행되어 결과 벡터를 채 웁니다. 사용 가능한 슬롯이없는 경우 코드는 슬롯에있는 선물 중 하나가 준비되어 있는지 확인합니다. 그렇다면 결과 벡터를 처리 한 다음 해당 슬롯을 사용합니다. 그렇지 않으면 몇 밀리 초를 기다립니다. 이 코드는 매우 잘 실행되고 사용할 수있는 프로세서의 수만큼 정확하게 확장됩니다. std::async을 호출 할 때마다 새로운 스레드가 만들어지고 실제로 프로세스 ID가 스크롤되는 것을 볼 수 있다는 것을 알았습니다. 이 오버 헤드를 제거하여 처음부터 모든 스레드를 생성하고 싶습니다. 진행 방법?

스레드 풀 구현 https://code.google.com/p/cppthreadpool/downloads/list 이 스레드 풀 구현을 발견했지만이 작업을 효율적으로 수행하려면 1 ~ 2 초가 걸릴 것이라고 나와 있습니다. 나는 멋진 스케줄링, 우선 순위 등을 필요로하지 않는다. 단지 스레드의 반복 된 생성과 파괴에 대한 오버 헤드를 제거하기를 원한다.

+0

std :: async를 사용하여 작업을 생성하는 테스트 프로그램을 실행하여 많은 작업이 동일한 스레드에서 실행되었음을 발견했습니다 !! 실제로 2 개의 스레드가 20 개의 비동기 작업을 실행하는 것을 볼 수 있습니다. 그래서 표준 라이브러리는 스레드 풀링을합니까? –

+0

어떤 OS입니까? 나는 주로 리눅스에 관심이있다. 동일한 스레드 ID가 아니라 동일한 스레드가 사용되었는지 어떻게 확인할 수 있습니까? – Thomas

+0

windows; vs2010; 마지막에 선물에 대해 기다림()을하는 것. –

답변

0

나는 std :: async를 사용하여 작업을 생성하는 테스트 프로그램을 실행했고 많은 작업이 같은 스레드에 의해 실행되었다는 것을 알았다 !! 실제로 2 개의 스레드가 25 개의 비동기 작업을 실행하는 것을 볼 수 있습니다. 그래서 표준 라이브러리가 이미 일부 스레드 풀링을 수행하는 것처럼 보입니다.

std::vector<std::future<void>> futures; 
    for (int i = 0; i < 25; ++i) 
    { 
     auto fut = std::async([] 
     {   
      std::cout << std::this_thread::get_id() <<std::endl; 
     }); 
     futures.push_back(std::move(fut)); 
    } 
    std::for_each(futures.begin(), futures.end(), [](std::future<void> & fut) 
    { 
     fut.wait(); 
    }); 
+3

표준 미래 전화에는 시작 정책이 없습니다. 런타임 구현은 주 스레드에서 모두 실행하도록 선택할 수 있습니다. 'std :: launch :: async'로 시도해주십시오. 나는 리눅스에있어 25 가지 스레드 ID를 얻는다. – Thomas

+0

'std :: launch :: async'를 사용하여 25 개의 작업에 약 6 개의 스레드가 있습니다. 1 : 4 스레드 : 말할 수있는 작업 비율 –

+0

@AbhijitKadam : MSVC는 스레드 풀을 사용하여 스레드를 재사용합니다. –

관련 문제