【问题标题】:How to work Dispatch_Sempahore when first call signal and第一次呼叫信号时如何工作调度信号量和
【发布时间】:2020-02-06 03:22:22
【问题描述】:

在 DispatchSemaphore 函数期间, 先调用 Signal() 再调用 Wait() 可以吗? 如果连续调用 Signal() N,内部的值是否变为 N, 或者我想知道如果没有调用Wait(),多次调用Signal()不会增加值。

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?

【问题讨论】:

  • 你试过了吗?如果您连续两次、三次或四次拨打sempahore.wait() 会发生什么?哪一个挡住了?
  • 是的,我做到了。尽管有多个 Wait() 号码,但对 Signal() 的一次调用将解锁锁。我不知道你怎么了。初始化Semaphore时是否与initValue有关?
  • @Viktor:这个问题不是 Swift 5 特有的。请添加 [swift5] 标签(或其他与版本相关的标签),仅针对有关该特定版本的语言更改的问题。

标签: swift dispatchsemaphore


【解决方案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 Documentation

您可以通过调用 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.

【讨论】:

  • 感谢您的回复。如果将信号量的初始值赋予 N 而不是零,那么每次调用 Signal() 时,这是否会随着 N+1、N+2、N+3 的增加而增加?
  • 是的,确实如此。如果在回答的示例中您将初始值设置为 1(而不是 0),那么第四次调用 wait 会通过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2015-10-28
  • 2012-06-07
相关资源
最近更新 更多