Deadlock(교착상태)는 깜직하게도 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)라는 오류를 만들어 앱을 터트립니다. 교착상태를 막아야겠죠?
이런 교착상태가 일어나는 상황을 직렬 큐일 때, 동시 큐일 때로 나누어보면,
1. Serial(직렬) Queue
- async 속 sync
DispatchQueue.main.async { // main queue == serial
DispatchQueue.main.sync {
// 교착상황!!
}
}
해결법 : 다른 큐에서 async로 사용하세요.
sync로 하면 교착상태가 또 나니까 주의하세유 -> 참조 : https://gogo-ios.tistory.com/46
DispatchQueue.global().async { // concurrent든 serial이든 상관없습니다.
// UI 업데이트 전 실행되는 코드
DispatchQueue.main.sync {
// UI 업데이트
}
// UI 업데이트 후 실행되는 코드
}
- sync 속 sync
DispatchQueue.main.sync { // main queue == serial
DispatchQueue.main.sync {
// 교착상황!!
}
}
2. Concurrrent(동시) Queue
Concurrent Queue의 특징은 Serial Queue와 다르게 교착상황이 무조건 일어나는 것이 아닌 가능성만 가지고 있다는 것입니다.
task를 할당할 수 있는 스레드가 여러 개이기 때문에 sync로 block된 스레드에 할당을 할지, 다른 스레드에 접근을 할 지는 모르는 일이기 때문입니다.
- async 속 sync
DispatchQueue.global().async { // global queue == concurrent
DispatchQueue.global().sync {
// 교착상황 가능성 있음. (반드시는 아님.)
}
}
- sync 속 sync
DispatchQueue.global().sync { // global queue == concurrent
DispatchQueue.global().sync {
// 교착상황 가능성 있음. (반드시는 아님.)
}
}
요약 - 둘 다 같은 큐일 때
async와 sync 속 sync -> 교착상황 O
async와 sync 속 async -> 교착상황 X
'ios' 카테고리의 다른 글
iOS 라이브러리 배포하는 법 - CocoaPods, SPM, Carthage (0) | 2022.03.07 |
---|---|
GCD에서 의도치 않은 교착상태를 피하는 법 (0) | 2021.12.22 |
DispatchQueue 종류 세 가지 (0) | 2021.12.21 |
동기/비동기, 직렬/동시 (0) | 2021.12.21 |
Error: realm accessed from incorrect thread (0) | 2021.11.19 |
댓글