Как работать 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.
Другие вопросы по тегам