본문 바로가기

IT/iOS

iOS Concurrency 프로그래밍, 동기/비동기 처리, GCD/Operation 에 대한 이해 (6)

6. 심화. 동시성과 관련된 문제

  • 2개 이상의 쓰레드를 사용하면서, 동일한 메모리 접근 등으로 인해 동시성과 관련된 문제가 발생한다.
  • 다른말로 Thread-Safety 하다고 한다.
    • Thread-safe(쓰레드 세이프) : 여러 쓰레드가 동시에 쓰여도 안전하다는 의미이다. → 동시적으로 처리를 하면서 (여러 스레드를 사용하면서도) 문제없이 스레드를 안전하게 사용가능하다는 의미이다.
    • 데이터(객체나 변수 등)에 여러 쓰레드를 사용하여 접근하여도, 한번에 한개의 쓰레드만 접근 가능하도록 처리하여 경쟁상황의 문제없이 사용할 수 있다는 것이다.
  • 동시성 문제는 크게 아래와 같이 3가지로 나뉘어진다.
    1. Race Condition (경쟁 상황)
    2. Deadlocks (교착 상태)
    3. Priority Inversion (우선 순위의 뒤바뀜)
  • 동시성 문제는 실행할 떄마다 항상 같은 순서로 발생하는 것이 아니기 떄문에 디버그 하기 어려운 특징이 있다.
  • 동시성 3가지 문제의 정리내용은 아래와 같다.

1) Race Condition (경쟁 상황)

  • 여러 쓰레드에서 하나의 객체 또는 값에 접근을 할 경우 쓰레드 경쟁 상황에 놓이게 되면서 제대로 된 값을 얻을 수 없게 된다.
  • 이에 따라 Thread-safe한 코드의 구현과 방법이 필요하다.

2) Deadlocks (교착 상태)

  • 교착상태란 다양한 쓰레드를 쓰는 환경에서 설계가 잘못되어 쓰레드가 멈추는 현상을 말한다.

3) Priority Inversion (우선 순위의 뒤바뀜)

  • 위에 개략도를 보면 task1, task3 은 같은 객체값을 사용하는 작업이고, task2는 다른 객체값을 사용한다.
  • 그러나 task1이 객체를 사용함에 따라 우선순위 task3이 a 객체를 사용하지 못하게 되면서 task2 가 우선적으로 실행되는 우선 순위 뒤바뀜 문제가 발생한다.