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 초가 걸릴 것이라고 나와 있습니다. 나는 멋진 스케줄링, 우선 순위 등을 필요로하지 않는다. 단지 스레드의 반복 된 생성과 파괴에 대한 오버 헤드를 제거하기를 원한다.
std :: async를 사용하여 작업을 생성하는 테스트 프로그램을 실행하여 많은 작업이 동일한 스레드에서 실행되었음을 발견했습니다 !! 실제로 2 개의 스레드가 20 개의 비동기 작업을 실행하는 것을 볼 수 있습니다. 그래서 표준 라이브러리는 스레드 풀링을합니까? –
어떤 OS입니까? 나는 주로 리눅스에 관심이있다. 동일한 스레드 ID가 아니라 동일한 스레드가 사용되었는지 어떻게 확인할 수 있습니까? – Thomas
windows; vs2010; 마지막에 선물에 대해 기다림()을하는 것. –