Race Condition 발생
#include <iostream>
#include <queue>
#include <thread>
void produce();
void consume();
//std::queue<int> q;
int sum = 0;
int main() {
std::cout << "초기 합계: " << sum << std::endl;
std::thread producer(produce);
std::thread consumer(consume);
producer.join();
consumer.join();
std::cout << "producer, consumer 스레드 실행 이후 합계: " << sum << std::endl;
return 0;
}
void produce() {
for(int i = 0; i < 100000; i++) {
// q.push(1);
sum++;
}
}
void consume() {
for(int i = 0; i < 100000; i++) {
// q.pop();
sum--;
}
}
이 C++ 코드는 생산자-소비자 모델의 간단한 멀티스레딩 예제를 보여줍니다. 프로그램은 생성(증가)을 담당하는 스레드와 소비(감소)를 담당하는 스레드 두 개를 사용하며, 두 스레드가 동시에 접근하는 공유 변수인 sum이 포함되어 있습니다.
적절한 동기화 메커니즘 없이 공유 변수에 동시에 접근하는 것은 경쟁 조건을 일으킬 수 있습니다. 이 예제에서는 두 스레드가 동시에 sum 변수를 수정하므로 예상치 못한 결과가 발생할 수 있습니다. 경쟁 조건을 피하기 위해 뮤텍스 또는 다른 스레드 안전한 구조물을 사용해야 합니다.
- Mutex Lock 해결
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 뮤텍스 선언
int sum = 0;
void acquire(std::mutex& mutex);
void release(std::mutex& mutex);
void produce();
void consume();
int main() {
std::cout << "초기 합계: " << sum << std::endl;
std::thread producer(produce);
std::thread consumer(consume);
producer.join();
consumer.join();
std::cout << "producer, consumer 스레드 실행 이후 합계: " << sum << std::endl;
return 0;
}
void acquire(std::mutex& mutex) {
mutex.lock(); // 락 획득 (acquire)
}
void release(std::mutex& mutex) {
mutex.unlock(); // 락 해제 (release)
}
void produce() {
for (int i = 0; i < 100000; i++) {
acquire(mtx);
sum++;
release(mtx);
}
}
void consume() {
for (int i = 0; i < 100000; i++) {
acquire(mtx);
sum--;
release(mtx);
}
}
레이스 컨디션을 해결하기 위해 뮤텍스(mutex)를 사용하여 공유 자원에 대한 동기화를 수행할 수 있습니다.
뮤텍스는 여러 스레드가 동시에 공유 자원에 접근하는 것을 막는 데 사용됩니다.
acquire 함수와 release 함수를 사용해서 레이스 컨디션 해결