동시성 관련된 문제

junseole·2021년 11월 23일
0
post-thumbnail

iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해를 보고 정리한 글입니다.

Race Condition (경쟁 상황)

var a = 1
DispathQueue.global().async{
	sleep(1)
	a += 1
}

DispathQueue.global().async{
	sleep(1)
	a += 1
}
print(a) //  1이 출력 왜냐하면 디스패치 큐가 비동기로 실행되어서 먼저 실행되어서 그렇다.

Deadlock(교착 상태)

동기 작업이 현재의 쓰레드가 필요한 경우

앞선 작업이 현재의 쓰레드가 필요한 경우

여러개의 세마포어가 존재할때, 순서 잘못 설계 등

해결법

Serial 큐로 해결 가능 (세마포어나 제한된 리소스 순서 같은 것 조심히 사용해야 하고, 객체 등 설계 시에 각별히 주의)

우선 순위 뒤바뀜(Priority Inversion)

우선 순위 뒤바뀜의 다양한 발생 가능성

  • 시리얼 큐에서 높은 우선순위 작업이 낮은 우선순위의 뒤에 보내지는 경우
  • 낮은 우선순위의 작업이 높은 우선순위가 필요한 자원을 잠그고 있는 경우
  • 높은 우선순위 작업이 낮은작업에 의존하는 경우

문제 해결은 ?

​ 1차적으로 GCD가 우선순위를 조정해서 알아서 해결 ( 낮은 우선순위 작업의 우선순위를 높여서 우선 처리)

​ 안전하게 공유된 자원 접근시 - 동일한 Qos 사용

profile
Swift와 함께 여행중입니다.

0개의 댓글