동시성 프로그래밍의 문제점과 해결 방법에 대해 알아보자

📖동시성 프로그래밍의문제점

비동기처리를 하면 각 작업이 여러 쓰레드에 배치되어 진행되기 때문에 여러 쓰레드가 하나의 메모리에 접근해 문제가 발생할 수 있음
바로바로 **경쟁 상태(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)")
        }
    }
}
  • 웅, 순차적으로 처리해서 누락 없고 순서 정상으로 배열 만들어줄게~~~~