创建初始值为0的信号量会导致执行问题

wm.*_*1us 2 semaphore grand-central-dispatch swift

我正在学习GCD并且对信号量有疑问.这是我的代码:

class ViewController: UIViewController {

    var semaphore: dispatch_semaphore_t! = nil

  override func viewDidLoad() {
    super.viewDidLoad()

    semaphore = dispatch_semaphore_create(0)


    dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)) {
      print("Entering")

      self.semaphoreTask()
      print(self.semaphore.debugDescription)
    }

    semaphoreTask()
     print(semaphore.debugDescription)
  }


  func semaphoreTask() {
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
    for i in 0...1000 {
      print(i)
      if i == 1000 {
        print("i is equal to 10000!")
      }
    }
    dispatch_semaphore_signal(self.semaphore)
  }
Run Code Online (Sandbox Code Playgroud)

如果我运行此代码,那么semaphoreTask中没有任何内容打印在控制台中,但如果我改变了

semaphore = dispatch_semaphore_create(0)
Run Code Online (Sandbox Code Playgroud)

semaphore = dispatch_semaphore_create(1)
Run Code Online (Sandbox Code Playgroud)

一切都开始运作良好.

问题是我为什么要写dispatch_semaphore_create(1)而不是0?

谢谢!

Wai*_*ain 6

您可以通过两种不同的方式使用信号量:

  1. 说工作或资源何时准备就绪.在这种情况下,您将信号量设置为0.创建者signal在准备就绪时调用.消费者呼叫wait等待预期的项目/资源.
  2. 限制并发操作/请求/使用的数量.在这种情况下,您以正值启动信号量,如4.每个呼叫的用户wait和资源可用,他们可以继续.如果不是,他们被阻止.每个人都完成了他们调用的资源signal.

所以,你看到它的预期是因为你将信号量设置为就绪标志,但是将其用作访问限制(因为你wait先调用).