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

wm.p1us

我正在学习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)
  }

如果我运行此代码,则semaphoreTask中的任何内容都不会打印在控制台中,但是如果我更改

semaphore = dispatch_semaphore_create(0)

semaphore = dispatch_semaphore_create(1)

一切开始顺利。

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

谢谢!

温恩

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

  1. 说出工作或资源准备就绪的时间。在这种情况下,您可以将信号量从0开始。创建者会signal在准备就绪时调用消费者打电话wait等待所需的物品/资源。
  2. 限制并发操作/请求/用法的数量。在这种情况下,您可以以正值(例如4)启动信号量。用户每次呼叫,wait并且如果有资源,则允许他们继续。如果没有,它们将被阻止。当每个人都完成资源后,他们将调用signal

因此,您看到的是预期的结果,因为您将信号量设置为就绪标志,但将其用作访问限制(因为您wait调用)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章