> 백엔드 개발 > C++ > C 11 스레드 풀은 어떻게 작업 관리를 개선하고 오버헤드를 줄일 수 있습니까?

C 11 스레드 풀은 어떻게 작업 관리를 개선하고 오버헤드를 줄일 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-22 21:35:10
원래의
980명이 탐색했습니다.

How Can C  11 Thread Pools Improve Task Management and Reduce Overhead?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿