적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/iOS

[iOS GCD] Concurrency Problems 동시성과 관련된 문제 + 해결방법

hongssup_ 2023. 2. 11. 18:21
반응형

2개 이상의 쓰레드를 사용하면서, 동일한 메모리 접근 등으로 인해 발생할 수 있는 문제

실행시마다 항상 같은 순서로 발생하는 것이 아니기 때문에 디버그 하기 어렵다. 

 

Thread-Safety 

- Thread-safe : 여러 쓰레드가 동시에 쓰여도 안전하다.

- 동시적 처리를 하면서(여러 쓰레드를 사용하면서도) 문제없이 쓰레드를 안전하게 사용하는 것

데이터(객체나 변수 등)에 여러 쓰레드를 사용하여 접근하여도, 한번에 한개의 쓰레드만 접근가능하도록 처리하여 경쟁상황의 문제없이 사용

 

 

1. Race Condition 경쟁상황

두 개 이상의 쓰레드가 한 곳의 메모리(저장공간)에 동시에 접근하여 값을 사용하려고 할 때 문제가 발생할 수 있다.

ex) 여러 쓰레드에서 동시다발적으로 쓰기 및 읽기를 할 경우 여러 쓰레드가 경쟁적으로 데이터에 접근(Race Condition)하여 원하는 결과가 나오지 않을 수 있음. 

해결 방법

 

 

2. Deadlocks 교착상태

두 개 이상의 쓰레드가 두 개 이상의 배타적인 자원 사용으로 인해(서로 점유하려고 하면서 자원 사용이 막힘) 작업이 이러지도 저러지도 못하고 진행이 되지 않는 상태

Deadlock 발생 가능성 

- 앞선 작업이 현재의 쓰레드가 필요한 경우

- 여러 개의 세마포어가 존재할 때 순서 잘못 설계 등

=> 시리얼 큐로 해결 가능

 

3. Priority Inversion 우선순위 뒤바뀜

낮은 우선순위의 작업이 작업을 배타적으로 사용하고 있을 때, (다른 작업이 자원을 사용하지 못하게 막고 있으므로) 작업의 우선순위가 바뀔 수 있음. 

(어느 정도는 GCD가 알아서 우선순위 조정해줌)

728x90
반응형