현재 GCD 관련 코드들을 테스트 중 한가지 이유를 모르겠는 상황이 발견되어 질문을 올리게 되었습니다.
DispatchQueue.main.async {
for i in 0..<100 {
print("🤖", i)
}
//👇그냥 선언하면 DispatchQueue.main.sync로 들어감.
}
for i in 100..<200 {
print("Ⓜ️", i)
}
위 같은 코드에서는 출력시 반드시 DispatchQueue,main.sync 내부의 코드가 먼저 실행되고 난 후 main.async 내부의 코드가 출력됩니다.
(아래 코드 참고)그런데 이와 비슷하게 Serial Custom Queue를 하나 만들어서 테스트를 해본 결과 이의 경우에는 반대로 async 내부의 코드가 반드시 먼저 출력이 되더군요…
let queue = DispatchQueue(label: "uniqueLabel")
queue.async {
for i in 0..<100 {
print("🤖", i)
}
}
queue.sync {
for i in 100..<200 {
print("Ⓜ️", i)
}
}
제 추측 : main queue는 무조건 main thread에서만 업무를 처리함. 그래서 async인 업무의 자리에 sync 업무가 들어와서 sync 업무가 다 처리된 후에 async 업무가 실행되었다고 생각합니다. 이 생각을 바탕으로 custom queue에서는 왜 저렇게 뜨는지 접근을 해보았는데, 큐에서 업무를 배분하는 쓰레드에 차이가 있는 건가? 라는 생각밖에 들지가 않습니다.
제가 공부한 바에 따르면 DispatchQueue.main.queue 자체가 Serial Queue이고 custom queue도 serial이라 다르게 실행되면 안될 것 같다는 생각이 드는데 왜 다르게 나오는지 도저히 이유를 모르겠습니다…