-
DispatchQueue 에서 주의할 데드락 현상개발/Swift 2022. 11. 21. 13:39
멀티스레딩을 사용할경우 Dispatch Queue를 사용해
main 혹은 global 큐를 통해 스레드를 지정해 작업을 하게된다.
이때 사용에 유의 해야할 점들이있다.
DispatchQueue.main.sync (데드락100)
UI작업은 메인스레드에서 작업하게 된다.
현재 상황이 메인스레드라면 이 안에서 main.sync를 사용하면 안된다.
//Main스레드 DispatchQueue.main.sync{ // 작업 }
- 메인큐로 작업을 보냄
- 작업이 끝날때 까지 메인스레드 대기 - sync
- 보내진 작업이 메인스레드로 전달 (대기중인데 전달됨)
- 데드락
스레드가 대기중인 상황에서 작업이 또 온다? - 데드락
메인스레드 상황
- 내가 대기하고 있던 작업이 끝날때까지 계속 기다리는중
- 또 다른 작업이 뒤에 와도 내 현재 작업이 끝나지 않으면 안함
- 대기하고 있던 작업이 끝나지 않음
위와같이 아무일도 안하는 상황이 발생한다.
같은큐 sync
위 메인스레드와 비슷하다
메인스레드에서 메인스레드로 작업을 보냈기에 데드락이 발생했다. global 큐에서도 같은 상황이 발생할수 있다.
같은 스레드로 작업이 sync로 보내지면 같은 문제가 발생한다. Qos에따라 다른 스레드에 할당될수도 있지만 같은 qos를 쓰면 발생할수 있다.
DispatchQueue.global().async{ DispatchQueue.global().sync{ // 작업 } }
'개발 > Swift' 카테고리의 다른 글
[Swift] Compositional Layout - 레이아웃 그려보기 (0) 2022.11.22 Closure 의 Capture 와 Self (0) 2022.11.21 Rxswift - ObserveOn , SubscribeOn (0) 2022.11.18 Rxswift 에러 핸들링 (complete, dispose 대응) (0) 2022.11.18 [Combine] - 1. publisher & subscriber (0) 2022.11.13