[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::queuestd::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++에서 뮤텍스와 워크 큐는 멀티스레드 프로그래밍에서 중요한 역할을 합니다. 뮤텍스는 임계 구역의 동시 접근을 제어하고, 워크 큐는 작업을 스레드에게 할당하여 효율적으로 처리할 수 있도록 돕습니다.

이러한 도구들을 올바르게 활용하여 안정적이고 효율적인 멀티스레딩 솔루션을 구현할 수 있습니다.

참고문헌: