반응형
C++ 에서 사용하는 Mutex 로 제공하는데, 사용할 때마다 사용 예제를 한번씩 살펴보게 되어 정리해 보았습니다.
std::lock_guard는 C++에서 여러 스레드가 공유하는 리소스에 대한 동기화를 쉽게 관리할 수 있게 해주는 클래스입니다. std::lock_guard는 생성될 때 mutex를 잠그고, 범위를 벗어나면 자동으로 mutex를 해제하여, 수동으로 잠금을 관리할 필요가 없게 만들어줍니다.
다음은 std::lock_guard를 사용한 예제입니다:
예제 코드
코드 상세 설명
- Mutex 선언 (std::mutex mtx;)
mtx는 std::mutex 타입의 객체로, 프로그램 내에서 공유 자원을 안전하게 보호하기 위한 목적으로 사용됩니다. 이 mtx 객체는 잠금(Lock)과 해제(Unlock) 기능을 제공하여 하나의 스레드만 특정 코드 구간에 접근하도록 보장합니다. - std::lock_guard 선언 (std::lock_guard<std::mutex> lock(mtx);)
- std::lock_guard는 lock 객체가 생성되면서 mtx를 잠급니다. 이로 인해 다른 스레드가 print_numbers 함수에서 mtx를 사용하려고 하면, lock이 해제될 때까지 기다리게 됩니다.
- lock은 print_numbers 함수가 끝날 때(즉, 스코프를 벗어날 때) 자동으로 소멸됩니다. std::lock_guard의 소멸자(destructor)가 호출되면서 mtx가 자동으로 해제됩니다. 이를 통해 우리가 직접 mtx.unlock()를 호출할 필요가 없어, 코드가 간결해지고 오류를 줄일 수 있습니다.
- 스레드 생성 (std::thread t1(print_numbers, 1); std::thread t2(print_numbers, 2);)
- std::thread를 이용해 두 개의 스레드 t1과 t2를 생성합니다.
- 각 스레드는 print_numbers 함수의 복사본을 실행하며, id 매개변수를 통해 구분됩니다(첫 번째 스레드는 id가 1이고, 두 번째 스레드는 2).
- 출력
- 두 스레드가 실행되면, std::cout으로 1부터 5까지의 숫자를 출력하게 됩니다.
- 스레드가 공유 자원인 std::cout에 접근할 때 std::lock_guard가 mtx를 잠그므로, 한 스레드가 std::cout을 통해 출력 중이면 다른 스레드는 대기합니다.
- 만약 std::lock_guard가 없었다면, 두 스레드가 동시에 std::cout에 접근할 수 있어 출력이 섞이거나 예기치 못한 결과가 발생할 수 있습니다.
- 스레드 종료 대기 (t1.join(); t2.join();)
- t1.join()과 t2.join()은 main 함수가 두 스레드가 끝날 때까지 기다리도록 합니다.
- join을 호출하지 않으면, main 함수가 스레드가 끝나기 전에 종료될 수 있습니다.
std::lock_guard가 필요한 이유
- 안전한 동시성 보장: std::lock_guard는 스레드가 공유 자원에 접근할 때, 다른 스레드가 해당 자원에 접근하지 못하게 막아줍니다. 이를 통해 스레드 간 충돌을 방지하고 데이터 무결성을 유지합니다.
- 자동 해제: std::lock_guard는 스코프를 벗어날 때 자동으로 mutex를 해제하므로, 실수로 unlock을 호출하지 않거나, 예외 상황에서 해제를 누락하는 등의 문제를 예방합니다.
이 예제에서는 print_numbers 함수 내의 std::cout 출력을 동기화해, 두 스레드의 출력이 섞이지 않도록 보장하고 있습니다.
'Computer Programming > C,C++,MFC' 카테고리의 다른 글
[C++] 디자인 패턴이란? (1) | 2024.11.12 |
---|---|
[C++] C++ 에서 JSON 파싱시 오류 방지를 위한 방법 (0) | 2024.11.12 |
[C++] std::vector 기본 설명 및 예제 (0) | 2024.11.06 |
[C]LineDraw - 브레젠험 알고리즘 (0) | 2021.06.29 |
[C/C++] C언어 입력함수 scanf (0) | 2017.02.15 |