[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::mutex
나 std::condition_variable
등을 사용하여 여러 스레드 간의 동기화를 처리해야 합니다. 또한, 작업 큐에 대한 접근을 안전하게 보호하여야 합니다.
이상으로 C++ 스레드 풀과 동기화 처리에 대한 간략한 소개를 마치겠습니다. 추가적인 내용은 C++ 공식 문서나 관련 블로그 등에서 자세히 확인하실 수 있습니다.