- 동시에 작업을 처리하는 비동기 프로그래밍의 문제점?
Race Condition
import Foundation
var cards = [1, 2, 3, 4, 5, 6, 7, 8, 9]
DispatchQueue.global().async {
for _ in 1...2 {
let card = cards.removeFirst()
print("데릭: \\(card) 카드를 뽑았습니다!")
}
}
DispatchQueue.global().async {
for _ in 1...2 {
let card = cards.removeFirst()
print("핀: \\(card) 카드를 뽑았습니다!")
}
}
DispatchQueue.global().async {
for _ in 1...2 {
let card = cards.removeFirst()
print("휴: \\(card) 카드를 뽑았습니다!")
}
}
DispatchQueue.global().async {
for _ in 1...2 {
let card = cards.removeFirst()
print("백곰: \\(card) 카드를 뽑았습니다!")
}
}
/*
휴: 1 카드를 뽑았습니다!
데릭: 1 카드를 뽑았습니다!
핀: 1 카드를 뽑았습니다!
백곰: 4 카드를 뽑았습니다!
핀: 8 카드를 뽑았습니다!
휴: 6 카드를 뽑았습니다!
백곰: 7 카드를 뽑았습니다!
데릭: 5 카드를 뽑았습니다!
*/
- 순서는 모르나 2개씩 카드를 가져감
- 실행할 때마다 출력 값이 달라짐
- 1을 3명이 뽑음??
- 코드가 동작은 하지만 제대로 동작하고 있지 않음
- 여러 개의 스레드를 사용하지 않는 프로그래밍에서는 어떤 상황에서나 코드가 순서대로(step by step) 실행이 되지만 스레드가 여러 개인 상황에서는 코드가 동시에 실행되어 하나의 값에 동시에 접근하는 경우가 발생할 수 있음
Thread Safe
- Race Condition이 발생하는 이유
- Swift의 배열이 Thread Safe하지 않기 때문
- Thread Safe하다? → 여러 스레드에서 동시에 접근이 불가능한 것
- Swift의 대부분의 타입들은 Thread Unsafe함