[c++] C++에서의 뮤텍스와 워크 큐 (Work queue) 관리
C++ 프로그래밍에서 뮤텍스(mutex)와 워크 큐(work queue)는 멀티스레딩 환경에서 데이터 동기화와 작업 관리를 위해 중요한 요소입니다. 뮤텍스를 사용하여 임계 구역(critical section)에 대한 접근을 제어하고, 워크 큐를 사용하여 스레드 간 작업을 분배할 수 있습니다.
1. 뮤텍스(Mutex)
뮤텍스는 공유 자원에 대한 접근을 제어하기 위한 동기화 메커니즘으로, 하나의 스레드만이 임계 구역에 접근할 수 있도록 합니다. C++에서는 std::mutex
클래스를 사용하여 뮤텍스를 구현할 수 있습니다.
아래는 뮤텍스를 사용하여 임계 구역을 보호하는 간단한 예제 코드입니다.
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void criticalSection()
{
mtx.lock();
// 임계 구역에 대한 작업 수행
mtx.unlock();
}
int main()
{
std::thread t1(criticalSection);
std::thread t2(criticalSection);
t1.join();
t2.join();
return 0;
}
2. 워크 큐(Work Queue)
워크 큐는 다수의 작업을 스레드에게 분배하고 실행 결과를 관리하는 데 사용됩니다. C++11부터는 std::queue
및 std::condition_variable
을 사용하여 워크 큐를 구현할 수 있습니다.
다음은 단순한 워크 큐 구현 예제입니다.
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
std::queue<int> workQueue;
std::mutex mtx;
std::condition_variable cv;
void workerThread()
{
while (true)
{
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return !workQueue.empty(); });
int task = workQueue.front();
workQueue.pop();
lock.unlock();
// 작업(task) 처리
if (workQueue.empty())
{
cv.notify_all();
}
}
}
void addTask(int task)
{
std::lock_guard<std::mutex> lock(mtx);
workQueue.push(task);
cv.notify_one();
}
int main()
{
std::thread worker(workerThread);
addTask(1);
addTask(2);
worker.join();
return 0;
}
결론
C++에서 뮤텍스와 워크 큐는 멀티스레드 프로그래밍에서 중요한 역할을 합니다. 뮤텍스는 임계 구역의 동시 접근을 제어하고, 워크 큐는 작업을 스레드에게 할당하여 효율적으로 처리할 수 있도록 돕습니다.
이러한 도구들을 올바르게 활용하여 안정적이고 효율적인 멀티스레딩 솔루션을 구현할 수 있습니다.
참고문헌:
- https://en.cppreference.com/w/cpp/header/mutex
- https://en.cppreference.com/w/cpp/header/condition_variable