[c++] C++ 스레드 풀과 동기화 처리

이번 포스트에서는 C++ 스레드 풀과 동기화 처리에 대해 알아보겠습니다.

C++ 스레드 풀이란 무엇인가요?

C++ 스레드 풀은 여러 가용성 있는 스레드를 포함하고 있는 일종의 컨테이너로, 작업을 스케줄링하고 동시에 실행할 수 있는 환경을 제공합니다. 스레드 풀을 사용하면 작업을 병렬로 처리하여 시스템 자원을 효율적으로 활용할 수 있습니다.

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] {
                while (true) {
                    std::function<void()> task;
                    {
                        std::unique_lock<std::mutex> lock(_queueMutex);
                        _condition.wait(lock, [this] { return _stop || !_tasks.empty(); });
                        if (_stop && _tasks.empty()) {
                            return;
                        }
                        task = _tasks.front();
                        _tasks.pop();
                    }
                    task();
                }
            });
        }
    }

    template<class F>
    void enqueue(F&& f) {
        {
            std::unique_lock<std::mutex> lock(_queueMutex);
            _tasks.emplace(std::forward<F>(f));
        }
        _condition.notify_one();
    }

    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock(_queueMutex);
            _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 _queueMutex;
    std::condition_variable _condition;
    bool _stop;
};

int main() {
    ThreadPool pool(4);
    for (int i = 0; i < 8; ++i) {
        pool.enqueue([] {
            std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
        });
    }
    return 0;
}

위의 코드는 ThreadPool 클래스를 사용하여 스레드 풀을 생성하고 작업을 스케줄링하는 예시입니다.

C++에서 스레드 풀과 동기화 처리

스레드 풀을 사용할 때에는 여러 스레드가 동시에 작업을 가져가는 상황을 고려해야 합니다. 이를 위해 std::mutexstd::condition_variable 등을 사용하여 여러 스레드 간의 동기화를 처리해야 합니다. 또한, 작업 큐에 대한 접근을 안전하게 보호하여야 합니다.

이상으로 C++ 스레드 풀과 동기화 처리에 대한 간략한 소개를 마치겠습니다. 추가적인 내용은 C++ 공식 문서나 관련 블로그 등에서 자세히 확인하실 수 있습니다.