C 11의 스레드 풀링
도전 과제:
스레드를 생성하고 관리하는 데 비용이 많이 들 수 있습니다. 특히 다음과 같은 경우에는 더욱 그렇습니다. 각 작업마다 반복됩니다. 스레드 생성의 오버헤드를 피하면서 여러 작업을 스레드 풀에 보낼 수 있는 스레드 풀을 어떻게 만들 수 있습니까?
답변:
스레드 구현 C 11의 풀에는 작업 실행에 재사용할 수 있는 스레드 컬렉션을 관리하는 클래스를 만드는 작업이 포함됩니다. 주요 측면에 대한 분석은 다음과 같습니다.
ThreadPool 클래스 구현:
ThreadPool 클래스는 스레드 풀 생성, 관리 및 중지를 위한 인터페이스를 정의합니다.
1. ThreadPool::Start:
지정된 개수의 스레드를 생성하여 스레드 풀을 초기화합니다. 이러한 스레드는 작업을 기다리면서 무한 루프를 실행합니다.
2. ThreadPool::ThreadLoop:
풀의 각 스레드가 실행하는 무한 루프입니다. 새로운 작업이 있는지 지속적으로 확인하고 실행하며 종료 신호가 올 때까지 반복합니다.
3. ThreadPool::QueueJob:
스레드 풀 대기열에 작업을 추가합니다. task는 수행할 작업을 정의하는 함수 객체입니다.
4. ThreadPool::busy:
스레드 풀에 대기 중인 작업이 있는지 확인합니다.
5. ThreadPool::Stop:
스레드 풀을 종료하고 모든 스레드가 현재 작업을 완료할 때까지 기다립니다.
ThreadPool 통합:
한 번 ThreadPool 클래스가 정의되어 있으므로 다음과 같이 사용할 수 있습니다. 다음은 다음과 같습니다.
thread_pool->QueueJob([] { /* ... */ });
예:
std::vector<std::thread> workers; int total = 4; int arr[4] = {0}; void each_thread_does(int i) { arr[i] += 2; } int main() { // ThreadPool Example ThreadPool thread_pool; thread_pool.Start(); for (int i = 0; i < 8; ++i) { for (int j = 0; j < 4; ++j) { thread_pool.QueueJob(std::bind(each_thread_does, j)); } } // Wait for the thread pool to complete while (thread_pool.busy()) {} thread_pool.Stop(); arr[4] = std::min_element(arr, arr + 4); return 0; }
이 예는 제공된 클래스를 사용하여 스레드 풀을 생성하고 반복적인 스레드 생성 및 삭제가 필요합니다.
위 내용은 C 11 스레드 풀은 어떻게 작업 관리를 개선하고 오버헤드를 줄일 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!