Как работает Dispatch_Sempahore, когда первый сигнал вызова и - PullRequest
0 голосов
/ 06 февраля 2020

Во время функции DispatchSemaphore, нормально ли сначала вызывать Signal (), а позже 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 Ответ

1 голос
/ 06 февраля 2020

Каждый .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.
...