Operation, OperationQueue를 사용하여 리팩토링하기
- DispatchQueue 등 GCD의 개념은 사용하지 않는다!
- race condition도 해결해야함
import Foundation
var cards = [1, 2, 3, 4, 5, 6, 7, 8, 9]
DispatchQueue.global().async {
for _ in 1...3 {
let card = cards.removeFirst()
print("야곰: \\(card) 카드를 뽑았습니다!")
}
}
DispatchQueue.global().async {
for _ in 1...3 {
let card = cards.removeFirst()
print("노루: \\(card) 카드를 뽑았습니다!")
}
}
DispatchQueue.global().async {
for _ in 1...3 {
let card = cards.removeFirst()
print("오동나무: \\(card) 카드를 뽑았습니다!")
}
}
- Race Condition 해결 방법 2가지
- 여러 스레드에서 Thread Unsafe한 타입에 동시에 접근하지 못하게 한다
- Serial로 실행한다
import Foundation
var cards = [1, 2, 3, 4, 5, 6, 7, 8, 9]
class Derrick: Operation {
override func main() {
super.main()
for _ in 1...3 {
let card = cards.removeFirst()
print("데릭: \\(card) 카드를 뽑았습니다!")
}
}
}
class Bing: Operation {
override func main() {
super.main()
for _ in 1...3 {
let card = cards.removeFirst()
print("웡빙: \\(card) 카드를 뽑았습니다!")
}
}
}
class Finn: Operation {
override func main() {
super.main()
for _ in 1...3 {
let card = cards.removeFirst()
print("핀: \\(card) 카드를 뽑았습니다!")
}
}
}
let operation = OperationQueue()
let derrick = Derrick()
let finn = Finn()
let wongbing = Bing()
operation.maxConcurrentOperationCount = 1
operation.addOperations([derrick, finn, wongbing], waitUntilFinished: true)