swift

DispatchSemaphore

motosw3600 2022. 2. 6. 15:49

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