C++ 멀티 스레드, 데이터 레이스 없이 안전하게 코딩하는 법
by DD
11개월 전
조회수 18
데이터 레이스 정의 및 발생 조건, C++ 메모리 모델에서의 연산 간 선후 관계 설명
기본 스레드 안전성 개념 소개, 표준 라이브러리 및 사용자 정의 타입의 안전성 분석
std::mutex 및 std::atomic을 활용한 외부 동기화 방법과 memory_order::relaxed 사용 시 주의점 제시
C++ 메모리 모델과 데이터 레이스
C++ 메모리 모델은 멀티 스레드 환경에서 데이터 레이스를 방지하기 위한 핵심이다. 구체적으로, 순차 실행 관계, 동기화 관계를 통해 연산 간 선후 관계를 정의한다. 따라서, atomic 연산과 mutex는 이러한 관계를 구축하는 중요한 도구로 활용된다.
기본 스레드 안전성: 사용자 정의 타입
사용자 정의 타입의 기본 스레드 안전성은 데이터 레이스 방지를 위한 중요한 원칙이다. 읽기/쓰기 접근, 연산 간 선후 관계를 고려하여 설계해야 한다. 반면, 표준 라이브러리 타입은 기본적으로 안전성을 보장하며, std::shared_ptr의 경우, 객체 자체는 안전하지만, 동일 객체에 대한 non-const 멤버 함수 호출은 주의해야 한다.
외부 동기화: std::mutex와 std::atomic
std::mutex를 사용하면 lock/unlock을 통해 연산 간 선후 관계를 명확하게 정의할 수 있다. 따라서, 크리티컬 섹션 내 데이터 접근을 안전하게 보호한다. std::atomic은 memory_order::release/acquire를 통해 외부 동기화를 구현하며, memory_order::relaxed 사용 시 데이터 레이스 발생 가능성을 주의해야 한다.