동시성 프로그래밍과 관련된 문제점
1. 경쟁상황 / 경쟁조건 (Race Condition)
•
Thread-safe 하지 않음 → 경쟁 상황 (Race Condition)이라고도 표현
•
멀티쓰레드의 환경에서, 같은 시점에 여러 개의 쓰레드에서 하나의 메모리에 동시접근 하는 문제
2. 교착상태 (DeadLocks)
•
멀티쓰레드의 환경에서, 배타적인 메모리 사용으로 일이 진행이 안되는 문제
•
2개 이상의 쓰레드가 서로 배타적인 메모리의 사용으로 인해(서로 잠그고 점유하려고 하면서) 메서드의 작업이 종료도 못하고 일의 진행이 멈춰버리는 상태
해결 방법
•
같은 시점에 동시에 접근 못하도록 Lock → Thread-Safe 처리
동시큐에서 직렬큐로 보내기
•
Thread-safe하지 않을 때, 처리하는 방법
// 배열은 여러쓰레드에서 동시에 접근하면 문제가 생길 수 있다.
var array = [String]()
let serialQueue = DispatchQueue(label: "serial")
for i in 1...20 {
DispatchQueue.global().async {
print("\(i)")
//array.append("\(i)") // <===== 동시큐에서 실행하면 동시다발적으로 배열의 메모리에 접근
serialQueue.async { // 올바른 처리 ⭐️
array.append("\(i)")
}
}
}
// 5초후에 배열 확인하고 싶은 코드 일뿐...
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
print(array)
//PlaygroundPage.current.finishExecution()
}
Swift
복사