이것은 내 답변에서 다른 유사한 게시물로 복사되었습니다. 도움이 될 수 있기를 바랍니다.
1) 시스템이 지원할 수있는 최대 스레드 수로 시작하십시오.
int Num_Threads = thread::hardware_concurrency();
2) 효율적인 스레드 풀 구현을 위해 Num_Threads에 따라 스레드가 생성되면 새 스레드를 만들거나 오래된 스레드를 결합하지 않는 것이 좋습니다. 성능이 저하되고 응용 프로그램이 직렬 버전보다 느려질 수 있습니다.
각 C ++ 11 스레드는 무한 루프를 사용하여 기능을 수행하면서 새로운 작업이 계속 실행되기를 기다립니다.
이러한 기능을 스레드 풀에 연결하는 방법은 다음과 같습니다.
int Num_Threads = thread::hardware_concurrency();
vector<thread> Pool;
for(int ii = 0; ii < Num_Threads; ii++)
{ Pool.push_back(thread(Infinite_loop_function));}
3) Infinite_loop_function
이것은 작업 대기열을 기다리는 "while (true)"루프입니다.
void The_Pool:: Infinite_loop_function()
{
while(true)
{
{
unique_lock<mutex> lock(Queue_Mutex);
condition.wait(lock, []{return !Queue.empty() || terminate_pool});
Job = Queue.front();
Queue.pop();
}
Job(); // function<void()> type
}
};
4) 대기열에 작업을 추가하는 기능 만들기
void The_Pool:: Add_Job(function<void()> New_Job)
{
{
unique_lock<mutex> lock(Queue_Mutex);
Queue.push(New_Job);
}
condition.notify_one();
}
5) 임의의 기능을 대기열에 바인딩
Pool_Obj.Add_Job(std::bind(&Some_Class::Some_Method, &Some_object));
이러한 구성 요소를 통합하면 고유 한 동적 스레딩 풀이 있습니다. 이 스레드는 항상 실행되어 작업을 기다립니다.
구문 오류가 있으면 죄송합니다. 이러한 코드를 입력하면 메모리가 부족합니다. 작업 무결성을 위반하는 완전한 스레드 풀 코드를 제공 할 수 없습니다.
편집 : 풀을 종료하려면 shutdown () 메소드를 호출하십시오.
XXXX::shutdown(){
{
unique_lock<mutex> lock(threadpool_mutex);
terminate_pool = true;} // use this flag in condition.wait
condition.notify_all(); // wake up all threads.
// Join all threads.
for(std::thread &every_thread : thread_vector)
{ every_thread.join();}
thread_vector.clear();
stopped = true; // use this flag in destructor, if not set, call shutdown()
}