Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 创建初始值为0的信号量会导致执行问题_Swift_Grand Central Dispatch_Semaphore - Fatal编程技术网

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

Swift 创建初始值为0的信号量会导致执行问题,swift,grand-central-dispatch,semaphore,Swift,Grand Central Dispatch,Semaphore,我在学习GCD,有个关于信号量的问题。 这是我的密码: class ViewController: UIViewController { var semaphore: dispatch_semaphore_t! = nil override func viewDidLoad() { super.viewDidLoad() semaphore = dispatch_semaphore_create(0) dispatch_async(dispatch_

我在学习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)
  }
如果我运行这段代码,那么控制台中不会打印来自信号量任务的任何内容,但是如果我更改

semaphore = dispatch_semaphore_create(0)

一切开始都很顺利

问题是为什么我应该写dispatch\u semaphore\u create(1)而不是0


谢谢大家!

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

  • 表示工作或资源何时准备就绪。 在本例中,信号量从0开始。当某物准备就绪时,创建者调用
    信号。消费者调用
    wait
    等待预期的项目/资源
  • 限制并发操作/请求/使用的数量。 在本例中,您以正值启动信号量,如4。用户每次调用
    等待
    ,如果资源可用,则允许他们继续。如果没有,它们将被阻止。当每个人都使用完资源后,他们调用
    信号

  • 因此,您所看到的是预期的,因为您正在将信号量设置为就绪标志,但将其用作访问限制(因为您首先调用
    wait

    所以我更正了代码,向您展示了我是如何修复它的(感谢@Wain)


    非常感谢。我明白了。所以如果我把0放进去,它想执行一些东西,但我说等待,它就等待。那是我的错误。再次感谢你!考虑打印正在运行的线程>代码> SimaPraceTebug ,这样您就可以看到它是主线程还是后台线程,并确认主线程等待后台线程完成。
    semaphore = dispatch_semaphore_create(1)
    
    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()
        }
    
    
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
        semaphoreTask()
      }
    
    
      func semaphoreTask() {
    
        print(semaphore.debugDescription)
        for i in 0...1000 {
          print(i)
          if i == 1000 {
            print("i is equal to 10000!")
          }
        }
        dispatch_semaphore_signal(self.semaphore)
      }
    }