동시성 프로그래밍의 문제점과 해결 방법에 대해 알아보자
📖동시성 프로그래밍의문제점
비동기처리를 하면 각 작업이 여러 쓰레드에 배치되어 진행되기 때문에 여러 쓰레드가 하나의 메모리에 접근해 문제가 발생할 수 있음
바로바로 **경쟁 상태(Race Condition)**와 데드락(Deadlock)!!!
📎경쟁 상태(Race Condition)
멀티 스레드의 환경에서 같은 시점에 여러 개의 스레드에서 하나의 메모리에 동시 접근하는 상황
- 메모리를 쓰고 있는 동안 다른 스레드에서 접근하지 못하도록 잠금 → Thread-Safe 처리
📎데드락(Deadlock)
멀티 쓰레드의 환경에서 베타적인 메모리 사용으로 일이 진행이 안되는 상황
📖동시성 프로그래밍의 문제점의 해결 방법
작업을 동시(Concurrent) 큐에서 직렬(Serial) 큐로 보내 처리
여러 쓰레드가 하나의 메모리에 접근하는 상황에 문제가 발생 → 직렬(Serial) 큐는 순서적으로 일을 처리하기 때문에, 직렬(Serial) 큐를 통해 하나하나 차례대로 메모리에 접근 가능

작업 처리 in 동시(Concurrent) 큐
var array = [String]()
let serialQueue = DispatchQueue(label: "serial")
for i in 1...20 {
DispatchQueue.global().async {
array.append("\(i)")
}
}- 동시다발적으로 배열의 메모리에 접근해 배열의 순서가 엉망이거나 값이 저장이 안되는 경우가 발생 가능
작업 처리 in 직렬(Serial) 큐
var array = [String]()
let serialQueue = DispatchQueue(label: "serial")
for i in 1...20 {
DispatchQueue.global().async {
// 직렬 큐로 잘 가랑~~
serialQueue.async {
array.append("\(i)")
}
}
}- 웅, 순차적으로 처리해서 누락 없고 순서 정상으로 배열 만들어줄게~~~~