[c++] C++11에서 도입된 뮤텍스 적용 방법
C++11부터는 스레드 간 동기화를 위해 std::mutex
가 도입되었습니다. 뮤텍스는 여러 스레드가 공유 데이터에 접근하는 것을 제어하기 위해 사용됩니다. 이번 글에서는 C++11에서 도입된 뮤텍스를 사용하여 스레드 간 동기화를 구현하는 방법에 대해 살펴보겠습니다.
1. std::mutex의 기본 사용법
뮤텍스는 std::mutex
클래스로 선언하고, lock()
및 unlock()
메서드를 사용하여 임계 영역을 보호합니다.
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void sharedPrint(const std::string& msg, int id) {
mtx.lock();
std::cout << "Message " << id << ": " << msg << std::endl;
mtx.unlock();
}
int main() {
std::thread t1(sharedPrint, "Hello", 1);
std::thread t2(sharedPrint, "World", 2);
t1.join();
t2.join();
return 0;
}
2. std::lock_guard를 활용한 뮤텍스 사용
std::lock_guard
는 뮤텍스의 라이프타임을 스코프의 끝까지 제한하여 깨끗한 자원 관리를 할 수 있게 해줍니다.
void sharedPrint(const std::string& msg, int id) {
std::lock_guard<std::mutex> guard(mtx);
std::cout << "Message " << id << ": " << msg << std::endl;
}
3. std::unique_lock를 활용한 뮤텍스 사용
std::unique_lock
은 std::lock_guard
와 유사하지만, 락을 해제하거나 다시 잠글 수 있는 유연성을 제공합니다.
void sharedPrint(const std::string& msg, int id) {
std::unique_lock<std::mutex> lock(mtx);
std::cout << "Message " << id << ": " << msg << std::endl;
// lock.unlock(); // 락 해제
// lock.lock(); // 다시 락 걸기
}
C++11에서 도입된 std::mutex
를 사용하면 멀티스레딩 환경에서의 동기화 문제를 효과적으로 해결할 수 있습니다. 기본적인 std::mutex
사용법부터 std::lock_guard
및 std::unique_lock
을 활용한 응용 방법까지 숙지하여 안정적인 멀티스레드 프로그래밍을 할 수 있습니다.
이상으로 C++11에서 도입된 뮤텍스 적용 방법에 대해 알아보았습니다. 감사합니다!
[참고 자료]
- http://www.cplusplus.com/reference/mutex/mutex/
- https://modoocode.com/239
- https://en.cppreference.com/w/cpp/thread/mutex