Thread-safe한 코드의 구현과 방법

brick·2023년 4월 12일
0

Concurrency Programming

목록 보기
6/6
post-thumbnail

Thread-Safety

  • 여러 쓰레드가 동시에 쓰여도 안전하다.
  • 동시적 처리를 하면서(여러 쓰레드를 사용하면서도) 문제없이 쓰레드를 안전하게 사용
  • 데이터(객체나 변수 등)에 여러 쓰레드를 사용하여 접근하여도, 한번에 한개의 쓰레드만 접근가능하도록 처리하여 경쟁상황의 문제없이 사용

  • Lock
    올바르게 구현하는 것은 어렵기도하고, 교착상황(Deadlocks)이 생길 가능성이 높다.(낮은수준)

TSan(Thread Sanitizer Tool)

경쟁상황을 파악할 수 있다.

시리얼큐와 Sync

  • 엄격한 Thread-safe

  • async 비동기 함수 내부에서 다시 비동기로 보내면 제대로된 값을 못 얻은 다음 사용할 수 있다.

  • sync의 의미는 글로벌 디폴트큐에서 시리얼큐로 보낸 작업을 기다린다는 의미이다.


  • sync 메서드는 메인쓰레드가 아닌 곳에서 사용 가능하며 잠재적 경쟁상황을 피하는데 유용한다.
  • 메인 쓰레드에서 떨어져 비동기적으로 실행되는 작업들은 여러 쓰레드에서 동작하므로, 유일한 객체에 접근 할때는 시리얼큐 및 sync메서드를 사용하여 일관된 값을 얻게 하여야 한다.

Dispatch Barrier(디스패치 배리어)

  • 조금 더 효율적인 방법

  • Concurrent큐 내의 여러개 스레드 중에서 "배리어 작업"의 경우, 한개의 쓰레드만 사용해 serial(직렬)로 실행가능한 방법

    • 읽기는 동시적으로 실행, 쓰기 작업은 장벽 작업으로 실행

객체 설계 시 주의할 점

  • 객체에 접근할 때 메인큐가 아닌 다른 큐에서 접근할 가능성이 있는가 생각해야한다.

lazy var 이슈

  • 여러 쓰레드에서 객체 내의 lazy var에 동시에 접근하면 여러개가 생성될 수 있다.
  • lazy var의 thread-safe 처리 방법
    • 명확하게, lazy 변수 생성 후, 작업
    • 시리얼큐 + Sync로 작업
    • Dispatch Barrier로 작업
    • 세마포어 이용, 작업의 동시 실행 갯수를 제한하기

참고

0개의 댓글