- 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)
}
출처: 야곰닷넷 동시성 프로그래밍 강좌