본문 바로가기

IT/iOS

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

7. 심화. Thread-safe한 코드의 구현과 방법

  • 앱스토어 출시전에는 반드시 잠재적 경쟁 상황에 놓여있는지 점검해야한다.
  • 그리고 Xcode에서 제공하는 기능인 TSan을 사용하면 잠재적 경쟁상태에 놓인 코드를 찾을 수 있다. 사용방법은 아래와 같다.

2) 시리얼큐와 sync

  • 개발을 하다보면 Thread-safe 를 보장하기 위해서 시리얼큐.sync 를 사용해야하는 상황이 발생한다.
  • 그리고 해당 예제는 아래와 같다.

 

 

Thread-safe 하지 않은 상황의 예제는 아래와 같다. → Xcode 파일로 예제 코드를 제공해줬다.

  • Thread-safe 한 상황의 예제는 아래와 같다. → Xcode 파일로 예제 코드를 제공해줬다.

  • 위와 같이 코드를 작성할 경우 2,3,4번 작업에 명명된 print 함수들이 순차적으로 수행되는데 기능상 print 함수는 순서에 맞게 진행될 필요가 없으므로 시리얼 함수에 안넣어줘도 된다.
  • print 문만 concurrent 큐로 처리하는 예제는 아래와 같다.
  • 하지만 아래와 같이 코드를 처리할때 작업1의 print가 되는 시점 이전에 작업2의 쓰기가 먼저 일어날 수 있는 문제가 있다. 그러므로 엄밀히 말하면 Thread-safe 한 코드는 아니라는 것이다.

 

3) 디스패치 배리어 (Dispatch Barrier)

  • Dispatch Barrier 에 대한 개념은 아래와 같다.

  • 위의 개념과 같이 concurrnt큐를 사용할 경우 작업을 수행하기 위해서 여러 쓰레드를 사용하는데 이것을 배러이 작업이라고 명명해줌에 따라 한개의 쓰레드만 사용해 serial(직렬)로 실행 가능하도록 만들어준다.
  • 위와 같은 방법을 통해서 순차적으로 작업을 수행함에 따라 객체 접근이 순차적으로 이뤄지면서 Thread-safe 한 작업을 하게 된다.
  • 예제는 아래와 같다.

 

4) 객체 설계시 주의할 점

  • 객체를 설계할 경우 여러 쓰레드에서 하나의 객체에 접근할 수 있는 사례가 발생할 수 있으므로 여러 객체가 접근하는 객체의 경우 하나의 쓰레드에서 작업이 이뤄지도록 설계를 해야한다.
  • 그리고 그 방법은 2가지가 있다.
    1. 시리얼큐 + sync
    2. 배리어처리