Concurrency Problems

brick·2023년 4월 11일
0

Concurrency Programming

목록 보기
5/6
post-thumbnail

Thread-Safety

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

Race Condition(경쟁 상황)

공유 자원에 대해 여러 개의 쓰레드가 동시적으로 접근하는 상태

확인 방법

  • TSan 사용

해결 방법

  • 시리얼큐 + Sync(엄격한 Thread-safe)
  • 디스패치 베리어 작업

Dead Lock(교착상태)

한정된 자원을 여러 쓰레드에서 사용하려고 할때, 자원을 얻지 못해 다음 처리를 위한 진행을 못하고 있는 상태

발생 생황

  • 동기 작업이 현재의 쓰레드가 필요한 경우
  • 앞선 작업이 현재의 쓰레드가 필요한 경우
  • 여러개의 세마포어가 존재할때, 순서 잘못 설계

해결 방법

  • 시리얼큐를 사용
  • 세마포어나 제한된 리소스 순서 같은 것을 조심해서 사용해야한다.

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

낮은 우선 순위의 작업이 자원을 배타적으로 사용하고 있을 때, (다른 작업이 자원을 사용하지 못하게 막고 있으므로) 작업의 우선 순위가 바뀔 수 있다.

발생 상황

  • 시리얼큐에서 높은 우선순위 작업이 낮은 우선순위의 뒤에 보내지는 경우
  • 낮은 우선순위의 작업이 높은 우선순위가 필요한 자원을 잠그고 있는 경우(lock코드, 세마포어 등)
  • 높은 우선수위 작업이 낮은 작업에 의존하는 경우(Operation)

해결 방법

  • GCD가 자원을 점유하고 있는 낮은 우선순위 작업의 우선순위를 높여서 처리
  • 공유된 자원에 대한 접근시 동일한 Qos를 사용해야한다.


참고

0개의 댓글