DispatchSemaphore
- semaphore를 사용하여 여러 실행 컨텍스트에서 리소스에 대한 액세스를 제어하는 개체
- semaphore를 사용하여 동시에 진행되는 작업의 개수를 제한하거나 두 스레드의 이벤트 완료 상태 동기화
- 임계구역에 들어갈때 wait()(value값 -1), 나올때는 signal()(value값 +1)호출
- 세마포어의 값이 0이되면 공유자원이 1개 이상이 될때까지 대기
DispatchSemaphore 생성
// 공유 자원의 개수가 3개인 세마포어 생성
let dispatchSemaphore = DispatchSemaphore(value: 3)
wait(), signal()을 통한 공유자원 접근 확인
for i in 1...5 {
dispatchSemaphore.wait() // 세마포어 감소
DispatchQueue.global().async {
// critical section
print("공유자원 접근 \(i)")
sleep(2)
print("공유자원 접근 종료 \(i)")
dispatchSemaphore.signal() // 세마포어 증가
}
}
semaphore의 값이 0이되면 다음 작업을 실행할 수 없기 때문에 한번에 3개(지정해준)의 작업만 실행
파란색 블록들 기준으로 실행
두 스레드간 이벤트 완료 상태 동기화
- DispatchSemaphore를 동시작업 갯수를 제한하는 방식으로 사용할 수도 있지만 두 스레드간의 특정 이벤트 완료 시점을 동기화 하는 경우에도 사용할 수 있다.
- DispatchSemaphore의 초기값을 0으로 설정
let dispatchSemaphore = DispatchSemaphore(value: 0)
print("task 1 대기")
DispatchQueue.global().async {
// task 1
print("task 1 시작")
sleep(2)
print("task 1 종료")
// 작업 완료 알려줌
dispatchSemaphore.signal()
}
// task1의 작업이 완료될 때까지 대기
dispatchSemaphore.wait()
print("task 1완료 task2 시작")
'swift' 카테고리의 다른 글
The Composable Architecture(TCA) (0) | 2022.03.02 |
---|---|
Memory Debugging(leak Test) (0) | 2022.02.20 |
UICollectionView Custom Layout (0) | 2022.02.03 |
Dynamic Cell Size CollectionView (0) | 2022.01.25 |
Tabbar Paging With CollectionView (0) | 2022.01.25 |