IOS의 GCD(Grand Central Dispatch)
: 멀티 코어 프로세서에 코드를 동시에 실행시킬 수 있도록 하는 프레임워크
GCD의 작업단위 : Task
Task를 Dispatch Queue에 전달하면 시스템은 해당 동시 코드를 처리함. Task의 단위는 {} 블록, DispatchWorkItem의 인스턴스가 된다.
Dispatch Queue는 Main Thread, Background Thread에서 Task들을 Serially or Concurrently 하도록 실행시키는 Dispatch Object의 클래스임.
비동기 : DispatchQueue.main.async { code } |
동기 : DispatchQueue.main.sync { code } |
Main Queue에 전달된 Task는 항상 Main Thread에 의해 수행된다.
Global Queue에 전달된 Task또한 Main Thread에서 수행될 수 있음 > sync의 메서드 성능 최적화로 인해 벌어지는 상황이며, 해당 판단은 GCD에서 실행함.
Issue
Main Queue에 sync로 Task를 전달한 경우, Dedlock을 통한 앱 강제종료 이슈 발생.
Conclusions
아직 반환되지 않은 Task가 존재하는 SerialQueue에 동기적으로 Task를 전달함. 관련 현상 발생 시, DeadLock이 걸리면서 앱이 종료되는 이슈가 발생.
Async를 통해 비동기 적으로 Task를 전달하는 경우, Task를 타겟 Queue에 추가만 하고 해당 코드 블록은 Return된다. 이후 추가된 Task는 GCD의 판단에 따라 해당 시점에 실행된다. 따라서 개발자는 정확한 실행 시점을 알 수가 없다.
Sync를 통해 동기적으로 Task를 전달하는 경우, 해당 Queue에 추가된 즉시 GCD는 Task를 Thread에 배정하고 해당 Task를 완료하기 전까지 Queue에 남은 Task에 Lock을 걸고 해당 코드 블록으로 Return 하지 않는다.
Lock이 걸리면 Queue에 남아있는 다른 Task들은 Thread를 배정 받을 수 없다.
See Also
- DispatchQueue, https://developer.apple.com/documentation/dispatch/dispatchqueue
- DispatchWorkItem, https://developer.apple.com/documentation/dispatch/dispatchworkitem