스레드 풀은 미리 할당된 스레드 풀을 유지하여 스레드를 관리하고 스레드 오버헤드를 줄이는 데 사용됩니다. 특정 시나리오에는 스레드 생성 및 삭제 오버헤드 감소, 리소스 고갈 방지를 위한 동시성 관리, 코드 단순성 향상 및 스레드 관리 세부 정보 제거가 포함됩니다.
C++ 다중 스레드 프로그래밍에서 스레드 풀 사용 시나리오
스레드 풀은 스레드 관리 메커니즘으로, 다중 스레드 프로그래밍의 효율성과 성능을 향상시킬 수 있습니다. C++에서는 std::thread
및 std::condition_variable
과 같은 표준 라이브러리를 사용하여 스레드 풀을 구현할 수 있습니다. std::thread
和 std::condition_variable
等标准库来实现线程池。
以下是一些使用线程池的常见场景:
实战案例
以下是一个使用 std::thread
和 std::condition_variable
在 C++ 中实现线程池的示例:
#include <condition_variable> #include <iostream> #include <mutex> #include <queue> #include <thread> #include <vector> using namespace std; // 线程池类 class ThreadPool { public: ThreadPool(int num_threads) : stop(false) { // 创建指定数量的线程并将其添加到线程池 for (int i = 0; i < num_threads; i++) { threads.emplace_back([this] { while (!stop) { unique_lock<mutex> lock(mtx); if (!tasks.empty()) { // 从任务队列中获取任务 auto task = tasks.front(); tasks.pop(); // 执行任务 task(); // 通知条件变量任务已完成 cv.notify_one(); } else { // 如果任务队列为空,则等待新任务 cv.wait(lock); } } }); } } ~ThreadPool() { // 停止所有线程 stop = true; cv.notify_all(); // 等待所有线程完成 for (auto& thread : threads) { thread.join(); } } // 向任务队列添加任务 void enqueue(function<void()> &&task) { unique_lock<mutex> lock(mtx); tasks.push(move(task)); // 通知条件变量有新任务 cv.notify_one(); } private: bool stop; // 线程池停止标志 mutex mtx; // 用于保护任务队列和条件变量 condition_variable cv; // 用于等待新任务 queue<function<void()>> tasks; // 任务队列 vector<thread> threads; // 线程池中的线程 }; int main() { // 创建具有 4 个线程的线程池 ThreadPool pool(4); // 向线程池添加 10 个任务 for (int i = 0; i < 10; i++) { pool.enqueue([i] { cout << "Task " << i << " executed by thread " << this_thread::get_id() << endl; }); } return 0; }
在这个例子中,我们创建了一个 ThreadPool
类,它维护一个预先分配的线程池。任务通过 enqueue
std::thread
와 std::condition_variable
를 사용하여 스레드 풀을 구현하는 예입니다. C++:🎜Task 0 executed by thread 139670130218816 Task 1 executed by thread 139670129941952 Task 2 executed by thread 139670130082240 Task 3 executed by thread 139670130226176 Task 4 executed by thread 139670129949696 Task 5 executed by thread 139670130233920 Task 6 executed by thread 139670129957440 Task 7 executed by thread 139670130090080 Task 8 executed by thread 139670130241664 Task 9 executed by thread 139670129965184
ThreadPool
클래스를 만듭니다. 작업은 enqueue
함수를 통해 작업 대기열에 추가됩니다. 스레드 풀의 스레드는 작업 큐에서 지속적으로 작업을 가져와 실행합니다. 작업 대기열이 비어 있으면 스레드는 조건 변수가 새 작업을 사용할 수 있다는 알림을 받을 때까지 기다립니다. 🎜🎜출력은 다음과 같습니다: 🎜rrreee위 내용은 C++ 다중 스레드 프로그래밍에서 스레드 풀의 사용 시나리오는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!