[c++] C++에서의 스레드 풀 구현

스레드 풀은 여러 작업을 처리하는 데 사용되는 스레드의 집합으로, 효율적인 리소스 관리를 위해 일반적으로 사용됩니다. C++에서는 스레드 풀을 구현하기 위해 다양한 방법이 있지만, <thread> 헤더 파일을 사용하여 간단하고 효율적인 방법으로 구현할 수 있습니다.

스레드 풀 구현

아래는 C++을 사용하여 기본적인 스레드 풀을 구현하는 간단한 예제입니다.

#include <iostream>
#include <thread>
#include <vector>
#include <queue>
#include <mutex>
#include <condition_variable>

class ThreadPool {
public:
    ThreadPool(size_t numThreads) : stop(false) {
        for (size_t i = 0; i < numThreads; ++i) {
            workers.emplace_back(
                [this] {
                    for (;;) {
                        std::function<void()> task;
                        {
                            std::unique_lock<std::mutex> lock(this->queue_mutex);
                            this->condition.wait(lock,
                                [this] { return this->stop || !this->tasks.empty(); });
                            if (this->stop && this->tasks.empty()) return;

                            task = std::move(this->tasks.front());
                            this->tasks.pop();
                        }
                        task();
                    }
                }
            );
        }
    }

    template<class F>
    void enqueue(F&& f) {
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            tasks.emplace(std::forward<F>(f));
        }
        condition.notify_one();
    }

    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            stop = true;
        }
        condition.notify_all();
        for (std::thread &worker : workers) {
            worker.join();
        }
    }

private:
    std::vector<std::thread> workers;
    std::queue<std::function<void()>> tasks;
    std::mutex queue_mutex;
    std::condition_variable condition;
    bool stop;
};

사용 예제

int main() {
    ThreadPool pool(4);

    for (int i = 0; i < 8; ++i) {
        pool.enqueue([i] {
            std::cout << "Task " << i << " is running" << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(1));
            std::cout << "Task " << i << " is done" << std::endl;
        });
    }
    
    return 0;
}

위의 코드는 ThreadPool 클래스를 정의하고, 메인 함수에서 해당 스레드 풀을 사용하는 간단한 예제를 보여줍니다. enqueue 함수를 사용하여 작업을 스레드 풀에 추가하고, 해당 작업이 수행됩니다.

스레드 풀은 다양한 플랫폼에서 사용되며, 효율적인 리소스 관리와 병렬 처리에 도움이 됩니다.

참고 자료