> 백엔드 개발 > C++ > 본문

C++ 동시 프로그래밍: 작업 스케줄링 및 스레드 풀 관리를 수행하는 방법은 무엇입니까?

WBOY
풀어 주다: 2024-05-06 10:15:02
원래의
1024명이 탐색했습니다.

작업 예약 및 스레드 풀 관리는 C++ 동시 프로그래밍의 효율성과 확장성을 향상시키는 열쇠입니다. 작업 예약: std::thread를 사용하여 새 스레드를 만듭니다. 스레드를 조인하려면 Join() 메소드를 사용하십시오. 스레드 풀 관리: ThreadPool 개체를 생성하고 스레드 수를 지정합니다. add_task() 메서드를 사용하여 작업을 추가합니다. 스레드 풀을 종료하려면 Join() 또는 stop() 메서드를 호출하십시오.

C++ 동시 프로그래밍: 작업 스케줄링 및 스레드 풀 관리를 수행하는 방법은 무엇입니까?

C++ 동시 프로그래밍: 작업 예약 및 스레드 풀 관리

소개

동시 프로그래밍에서 작업 예약 및 스레드 풀 관리는 애플리케이션의 효율성과 확장성을 향상시키는 데 중요합니다. 이 문서에서는 C++의 작업 예약 개념을 안내하고 C++11 표준의 std::threadstd::mutex를 사용하여 관리하는 방법을 보여줍니다. 스레드 풀. std::threadstd::mutex 来管理线程池。

任务调度

任务调度涉及分配和执行异步任务。在 C++ 中,可以使用 std::thread 来创建新线程:

std::thread t([]() {
  // 执行异步任务
});
로그인 후 복사

要加入线程,请使用 join() 方法:

t.join();
로그인 후 복사

线程池管理

线程池是一个预先创建并管理的线程集合,可用于处理任务。使用线程池可以避免反复创建和销毁线程的开销。

以下是如何在 C++ 中创建和管理线程池:

class ThreadPool {
public:
  ThreadPool(int num_threads) {
    for (int i = 0; i < num_threads; i++) {
      threads_.emplace_back(std::thread([this]() { this->thread_loop(); }));
    }
  }

  void thread_loop() {
    while (true) {
      std::function<void()> task;

      {
        std::lock_guard<std::mutex> lock(mtx_);
        if (tasks_.empty()) {
          continue;
        }

        task = tasks_.front();
        tasks_.pop();
      }

      task();
    }
  }

  void add_task(std::function<void()> task) {
    std::lock_guard<std::mutex> lock(mtx_);
    tasks_.push(task);
  }

  void stop() {
    std::unique_lock<std::mutex> lock(mtx_);
    stop_ = true;
  }

  ~ThreadPool() {
    stop();

    for (auto& t : threads_) {
      t.join();
    }
  }

private:
  std::vector<std::thread> threads_;
  std::queue<std::function<void()>> tasks_;
  std::mutex mtx_;
  bool stop_ = false;
};
로그인 후 복사

要使用线程池,可以执行以下步骤:

  1. 创建一个线程池对象,指定要创建的线程数。
  2. 使用 add_task() 方法将任务添加到线程池。
  3. 调用 join()stop() 方法来关闭线程池并等待所有任务完成。

实战案例

以下是一个使用线程池在多核系统上执行并发任务的示例:

#include <iostream>
#include <vector>
#include "thread_pool.h"

int main() {
  ThreadPool pool(4);

  std::vector<std::future<int>> futures;
  for (int i = 0; i < 10000; i++) {
    futures.push_back(pool.add_task([i]() { return i * i; }));
  }

  for (auto& f : futures) {
    std::cout << f.get() << std::endl;
  }

  return 0;
}
로그인 후 복사

结论

通过使用 std::thread

🎜작업 예약🎜🎜🎜작업 예약에는 비동기 작업 할당 및 실행이 포함됩니다. C++에서는 std::thread를 사용하여 새 스레드를 만들 수 있습니다. 🎜rrreee🎜스레드를 조인하려면 join() 메서드를 사용하세요. 🎜rrreee🎜🎜Thread 풀 관리 🎜🎜🎜스레드 풀은 작업을 처리하는 데 사용할 수 있는 미리 생성되고 관리되는 스레드 모음입니다. 스레드 풀을 사용하면 스레드를 반복적으로 생성하고 삭제하는 오버헤드가 방지됩니다. 🎜🎜C++에서 스레드 풀을 생성하고 관리하는 방법은 다음과 같습니다. 🎜rrreee🎜스레드 풀을 사용하려면 다음 단계를 수행할 수 있습니다. 🎜
  1. 생성할 스레드 수를 지정하여 스레드 풀 개체를 생성합니다. .
  2. 스레드 풀에 작업을 추가하려면 add_task() 메서드를 사용하세요.
  3. join() 또는 stop() 메서드를 호출하여 스레드 풀을 닫고 모든 작업이 완료될 때까지 기다립니다.
🎜🎜실용 사례🎜🎜🎜다음은 스레드 풀을 사용하여 멀티 코어 시스템에서 동시 작업을 수행하는 예입니다. 🎜rrreee🎜🎜결론🎜🎜🎜 std를 사용하여 ::thread code> 및 스레드 풀은 C++에서 동시 작업을 효과적으로 관리할 수 있습니다. 멀티 코어 시스템의 과학적 컴퓨팅이든, 대량의 요청을 처리해야 하는 웹 서비스이든, 스레드 예약 및 스레드 풀 관리는 코드 효율성과 확장성을 향상시키는 데 핵심입니다. 🎜

위 내용은 C++ 동시 프로그래밍: 작업 스케줄링 및 스레드 풀 관리를 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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