[c++] 뮤텍스를 사용한 프로듀서-컨슈머 문제 해결

프로듀서-컨슈머 문제는 멀티스레드 프로그래밍에서 자주 발생하는 문제 중 하나입니다. 이 문제는 두 개의 스레드가 동일한 자원을 공유할 때 발생하는 동기화 문제로, 하나의 스레드가 데이터를 생성하고 다른 스레드가 데이터를 소비하는 상황에서 발생합니다.

문제점

프로듀서-컨슈머 문제는 여러 스레드가 동시에 공유 자원에 접근할 때 발생하는 경쟁 조건으로 인해 일어납니다. 이로 인해 데이터가 무효화되거나 소비자가 제대로 동기화되지 않는 등의 문제가 발생할 수 있습니다.

뮤텍스(Mutex)란?

뮤텍스는 상호배제(mutual exclusion)를 제공하여 공유 자원에 대한 접근을 조절하는 데 사용되는 동기화 메커니즘입니다. 뮤텍스를 사용하면 한 번에 하나의 스레드만이 보호된 자원에 접근할 수 있습니다.

뮤텍스를 사용한 해결법

아래는 C++에서 뮤텍스를 사용하여 프로듀서-컨슈머 문제를 해결하는 간단한 예시입니다.

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

std::mutex mtx;
std::queue<int> dataQueue;

void producer() {
    for (int i = 0; i < 10; ++i) {
        std::lock_guard<std::mutex> lock(mtx);
        dataQueue.push(i);
        std::cout << "Produced: " << i << std::endl;
    }
}

void consumer() {
    for (int i = 0; i < 10; ++i) {
        std::lock_guard<std::mutex> lock(mtx);
        if (!dataQueue.empty()) {
            int data = dataQueue.front();
            dataQueue.pop();
            std::cout << "Consumed: " << data << std::endl;
        }
    }
}

int main() {
    std::thread producerThread(producer);
    std::thread consumerThread(consumer);

    producerThread.join();
    consumerThread.join();

    return 0;
}

위 코드에서 std::mutex를 사용하여 mtx라는 뮤텍스 객체를 생성하고, 프로듀서와 컨슈머 함수에서 std::lock_guard를 사용하여 뮤텍스를 잠금 처리하였습니다.

결론

뮤텍스를 사용하여 프로듀서-컨슈머 문제를 해결할 수 있습니다. 뮤텍스는 동시에 공유 자원에 접근하는 것을 제어하여 데이터의 일관성과 안전성을 보장할 수 있습니다.