본문 바로가기
iOS

[iOS] Thread Sanitizer을 이용한 Race Condition (경쟁 상태) 확인

by 정석 지향 2023. 1. 27.
반응형

개발을 진행하면서 어떤 데이터에 접근할 때 크래쉬가 발생하여, 버그를 찾던 중 경쟁 상태 문제임을 확인하였습니다.

경쟁 상태란 공유 자원에 여러 프로세스 또는 스레드가 동시에 접근할 때 결과값에 영향을 줄 수 있는 상태를 의미합니다.

 

Xcode의 Thread Sanitizer을 이용하면 멀티스레딩 환경에서 하나의 자원에 접근할 때 발생하는 Race Condition문제를 확인할 수 있는데요, 이해하기 쉽도록 어떠한 상황에서 경쟁 상태가 발생되는지 간략하게 정리해봤습니다.

 

Thread Sanitizer 설정 방법

Product -> Scheme -> Edit Scheme에서 아래와 같이 Thread Sanitizer을 체크합니다.

 

경쟁 상태 구현

1. test() 함수 내부에서 비동기로 메인 스레드와 글로벌 스레드가 동시에 작업을 수행하고 있는 상태입니다.

2. 메인 스레드는 공유 자원인 sharedArray을 계속 읽고 있지만, 글로벌 스레드는 공유 자원인 sharedArray의 값을 계속해서 쓰고 있습니다.

3. 즉, 하나의 자원을 동시에 읽고 쓰기 때문에 Thread Sanitizer가 Swift access race in... 오류가 나타났습니다.

 

아래와 같이 콘솔에서도 경쟁 상태임을 확인할 수 있었습니다.

빨간 네모를 확인해 보면 메인 스레드는 읽고 있으며, 다른 스레드에서는 수정을 하고 있음을 나타냅니다.

 

경쟁 상태가 왜 문제가 될까요?

위 코드를 통해 간단하게 이해해 보면 메인 스레드에서 실행되는 print()가 글로벌 스레드 내부에서 진행되는 for문이 몇 번째 일 때 실행될지 모르기 때문에 당연히 실행할 때마다 매번 값이 달라집니다. 즉, 결과값을 예측할 수 없으며 결과값에 영향을 주기 때문에 문제가 발생하게 됩니다.

 

반응형

'iOS' 카테고리의 다른 글

iOS 정적 링킹, 동적 링킹  (0) 2023.06.20
Swift, Objective-C 함께 사용하기  (0) 2023.06.20
Xcode 빌드 멈춤  (0) 2022.01.14
[iOS] window 객체 찾기  (0) 2021.08.16
[iOS] 상태바 높이 구하기  (0) 2021.08.16