Как работать Dispatch_Sempahore при первом сигнале вызова и
Можно ли сначала вызвать Signal () во время функции DispatchSemaphore, а позже - Wait()? Если вызывать Signal() N непрерывно, значение внутри становится N, или мне интересно, не вызывает ли несколько раз Signal () увеличение значения, когда Wait() не вызывается.
let sempahore = DispatchSemaphore(value: 0)
semaphore.signal()
semaphore.signal()
semaphore.signal()
// in time, what is sempahore value? 1 or 3?
sempahore.wait()
// in time, what is semaphore value? 0 or 2?
// wait for more signal? or not?
1 ответ
Решение
Каждые .signal
равно "+1", и каждый .wait
'-1' или block
как описано в документации, а код этой демонстрации
let semaphore = DispatchSemaphore(value: 0)
semaphore.signal() // = 1
semaphore.signal() // = 2
semaphore.signal() // = 3
semaphore.wait() // = 2 - pass
semaphore.wait() // = 1 - pass
semaphore.wait() // = 0 - pass
semaphore.wait() // = -1 - hang - waiting for new signal()
Вот из документации Apple
Вы увеличиваете счетчик семафоров, вызывая метод signal(), и уменьшаете счетчик семафоров, вызывая wait() или один из его вариантов, который задает тайм-аут.
@discardableResult func signal() -> Int Discussion Increment the counting semaphore. If the previous value was less than zero, this function wakes a thread currently waiting func wait() Discussion Decrement the counting semaphore. If the resulting value is less than zero, this function waits for a signal to occur before returning.