- GCD와 DispatchQueue는 다른 개념이다. GCD가 더 넓은 개념이며 GCD는 Dispatch와 동치시킬수 있다.
- Dispatch 프레임워크에는 DispatchQueue, DispatchWorkItem, DispatchGroup, DispatchQoS.... 등 여러가지 클래스들이 모여 있다.
/ Serial Queue
DispatchQueue(label: "Serial")
DispatchQueue.main
// main은 전역적으로 사용되는 Serial DispatchQueue
// Concurrent Queue
DispatchQueue(label: "Concurrent", attributes: .concurrent)
DispatchQueue.global()
main은 프로퍼티고 global은 메서드인 이유?
- main은 앱이 실행되는 동안 항상 위에 올라와 있는 스레드이고 global은 작업을 추가하면 새로운 스레드를 만들어 그곳에서 작업을 처리하게 되므로.
global()이 호출되면 작업을 처리하기 위해 메모리에 올라왔다가, 작업이 끝나고 나면 메모리에서 제거// 동기, sync
DispatchQueue.main.sync {} 작업이 끝날 때까지 기다린다.
DispatchQueue.global().sync {} // main 스레드 말고 새로운 스레드를 만들어서 작업을 처리, 그런데 작업이 끝날 때까지 기다린다.
// 비동기, async
DispatchQueue.main.async {}
DispatchQueue.global().async {} // main 스레드 말고 새로운 스레드를 만들어서 작업을 처리, 다음 작업이 있다면 기다리지 말고 처리


import Foundation
DispatchQueue.main.async {
for _ in 1...5 {
print("😀😀😀😀😀")
sleep(1)
}
}
DispatchQueue.main.async {
for _ in 1...5 {
print("🥶🥶🥶🥶🥶")
sleep(2)
}
}
// 결과:
//😀😀😀😀😀
//😀😀😀😀😀
//😀😀😀😀😀
//😀😀😀😀😀
//😀😀😀😀😀
//🥶🥶🥶🥶🥶
//🥶🥶🥶🥶🥶
//🥶🥶🥶🥶🥶
//🥶🥶🥶🥶🥶
//🥶🥶🥶🥶🥶

import Foundation
DispatchQueue.main.async {
for _ in 1...5 {
print("😀😀😀😀😀")
sleep(1)
}
}
for _ in 1...5 {
print("🥶🥶🥶🥶🥶")
sleep(2)
}
import Foundation
DispatchQueue.global().async {
for _ in 1...5 {
print("😀😀😀😀😀")
sleep(1)
}
}
DispatchQueue.global().async {
for _ in 1...5 {
print("🥶🥶🥶🥶🥶")
sleep(2)
}
}
DispatchQueue.main.async {
for _ in 1...5 {
print("🥵🥵🥵🥵🥵")
sleep(1)
}
}
/* - 출력 (랜덤)
😀😀😀😀😀
🥶🥶🥶🥶🥶
🥵🥵🥵🥵🥵
😀😀😀😀😀
🥵🥵🥵🥵🥵
😀😀😀😀😀
🥶🥶🥶🥶🥶
🥵🥵🥵🥵🥵
😀😀😀😀😀
🥵🥵🥵🥵🥵
🥶🥶🥶🥶🥶
😀😀😀😀😀
🥵🥵🥵🥵🥵
🥶🥶🥶🥶🥶
🥶🥶🥶🥶🥶
*/

import Foundation
DispatchQueue.global().sync {
for _ in 1...5 {
print("😀😀😀😀😀")
sleep(1)
}
}
DispatchQueue.global().sync {
for _ in 1...5 {
print("🥶🥶🥶🥶🥶")
sleep(2)
}
}
for _ in 1...5 {
print("🥵🥵🥵🥵🥵")
sleep(1)
}

Deadlock: 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태 (위키피디아)
import Foundation
DispatchQueue.global().async {
DispatchQueue.main.sync {
for _ in 1...5 {
print("😀😀😀😀😀")
sleep(1)
}
}
}
for _ in 1...5 {
print("🥶🥶🥶🥶🥶")
sleep(2)
}
출처: 야곰닷넷 동시성 프로그래밍 강좌