[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
를 사용하여 뮤텍스를 잠금 처리하였습니다.
결론
뮤텍스를 사용하여 프로듀서-컨슈머 문제를 해결할 수 있습니다. 뮤텍스는 동시에 공유 자원에 접근하는 것을 제어하여 데이터의 일관성과 안전성을 보장할 수 있습니다.