Open stemmmm opened 2 months ago
[우선순위가 없는 방식]
[저자 우선 방식]
[필요한 이유]
[생산자]
[소비자]
[대기큐]
let bufferCapacity = 5 // 버퍼의 용량
var buffer: [Int] = []
let semaphoreFull = DispatchSemaphore(value: 0) // 소비자 대기 신호
let semaphoreEmpty = DispatchSemaphore(value: bufferCapacity) // 생산자 대기 신호
let accessQueue = DispatchQueue(label: "bufferAccess")
func producer(item: Int) {
// 버퍼에 빈 공간이 있는지 확인 (세마포어 감소)
semaphoreEmpty.wait()
// 버퍼에 데이터 추가하기
accessQueue.sync {
buffer.append(item)
}
// 소비자에게 버퍼에 데이터가 있음을 알림 (세마포어 증가)
semaphoreFull.signal()
}
func consumer() {
// 버퍼에 데이터가 있는지 확인
semaphoreFull.wait()
var item: Int?
accessQueue.sync {
item = buffer.removeFirst()
print("소비 아이템 \(item)")
}
// 버퍼 카운트를 증가 -> 생산자가 저장할 공간이 늘어남
semaphoreEmpty.signal()
}
DispatchQueue.global().async {
for i in 1...10 {
producer(item: i)
}
}
DispatchQueue.global().async {
for _ in 1...10 {
consumer()
}
}
semaphoreEmpty
를 통해 버퍼에 자리가 있는지 확인semaphoreFull
를 통해 버퍼에 사용가능한 데이터가 있음을 표시semaphoreFull
를 통해 버퍼에 사용할 데이터가 있는지 확인semaphoreEmpty
를 통해 버퍼에 자리가 생겨남을 표시