09-28 08:38
Notice
Recent Posts
Recent Comments
09-28 08:38
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

pear

[iOS]DispatchQueue concurrency 본문

iOS/etc

[iOS]DispatchQueue concurrency

pearlab 2023. 6. 16. 10:38

ConcurrencyQueue

 

Concurrency sync Task process

iOS에서 ConcurrencyQueue 사용 이유

결론부터 이야기하자면 Dead Lock 때문이다.

 

순차적으로 처리되어야 하는 API Set이 있고 API 처리시간이 짧아 Simple하게 API를 만들고 싶다면

iOS에 익숙지 않다면 SerialQueue에 Sync를 생각하게 된다.

 

하지만 기본적으로 UI가 처리되는 main thread는 SerialQueue Sync이고

UI 동작 내에서 API를 호출하면 DeadLock 이슈가 발생하게 된다.

 

main.sync{

//[Todo]Print

SerialQueue.sync{

---DeadLock---

//[Todo]Print

}

}

 

main.sync는 thread내에 처리가 완료되어야 next로 넘어 갈수 있고

SerialQueue.sync는 main.sync가 종료되어야 시작할 수 있다. 

 

그러므로 main.sync가 종료하지 못하는 DeadLock이슈가 발생한다.(EXE_BAD_INSTRUCTION)

물론 별도의 async thread에서 API를 호출하거나 API를 async로 처리하여 해결할 수 있다.

 

하지만 개발 시장에는 delegate, protocol, oversever pattern을 익숙하지 않은 사람들이 많이 있으며

간단한 API와 SDK Q&A를 줄이는 것이 목적이다.

 

그래서 실험하게 된 것이 ConcurrencyQueue sync이다.

여러 Thread에서 분산 처리되지만 sync로 처리하기 때문에 여전히 순차적으로 처리할 수 있으며

SerialQueue.sync로 인한 DeadLock이슈도 해결 할 수 있다.

 

아직 정확한 내부적인 매커니즘을 이해하지 못했지만

java의 post event와 유사하게 흘러가는 것 같다.

sync로 처리되기 때문에 테스트시 OS에서 thread를 재활용해서  무한정 생성하는것 같지는 않다.

 

iOS의 Queue를 사용할 때 thread와 상관 관계를 한번더 확인해야 할 것 같다.

 

 

참고용

ConcurrencyQueue async