Semaphore: 정수 변수, 멀티프로그래밍 환경에서 공유자원에 대한 접근을 제한하는 방법으로 사용됨.
→ #49 에서 thread-safe 구현하기 위한 방법으로 처음 만났던 것 ㄱ나니,,?
스레드가 공유자원의 배타적인 사용을 보장받기 위해서, 임계구역에 들어가서 나올 때는 세마포어 같은 동기화 메커니즘이 사용됨
공유자원: 멀티쓰레드에서 한 프로세스 내에서 공유되는 code, data, heap(stack은 공유 X)
1. 동시 작업 개수 제한
iOS에서는 세마포어를 위해 DispatchSemaphore 객체 이용
let semaphore = DispatchSemaphore(value: 2)
for i in 1...3 {
semaphore.wait() //semaphore 감소
DispatchQueue.global().async() {
//임계 구역(critical section)
print("공유 자원 접근 시작 \(i)")
sleep(3)
print("공유 자원 접근 종료 \(i)")
semaphore.signal() //semaphore 증가
}
}
공유 자원에 접근 가능한 작업의 갯수, 즉 한 번에 실행이 가능한 작업의 갯수가 2이다.
wait() : 임계구역에 들어갈 때 호출, semaphore를 감소
signal(): 임계구역에서 나올 때 호출, semaphore를 증가
2. 두 스레드의 특정 이벤트 완료 상태 동기화
let semaphore = DispatchSemaphore(value: 0)
DispatchQueue.global(qos: .background).async {
//task A
semaphore.signal()
}
semaphore.wait()
DispatchSemaphore
Semaphore
1. 동시 작업 개수 제한
DispatchSemaphore
객체 이용wait()
: 임계구역에 들어갈 때 호출,semaphore
를 감소signal()
: 임계구역에서 나올 때 호출,semaphore
를 증가2. 두 스레드의 특정 이벤트 완료 상태 동기화
DispatchSemaphore
의 초기값 0으로 설정wait()
호출signal()
호출🔖 출처