【问题标题】:How to ask a semaphore for returning immediately rather than wait for signal?如何要求信号量立即返回而不是等待信号?
【发布时间】:2018-10-19 21:06:41
【问题描述】:

我想有效地实现这种行为:

一个函数被要求运行(由用户)。知道这个函数也会被计时器自动重复调用,我想确保函数在它已经运行时返回。

在伪代码中:

var isRunning = false

func process() {

    guard isRunning == false else { return }

    isRunning = true

    defer {
        isRunning = false
    }

    // doing the job
}

我知道信号量的概念:

let isRunning = DispatchSemaphore(value: 1)

func process() {

    // *but this blocks and then passthru rather than returning immediately if the semaphore count is not zero.    
    isRunning.wait()

    defer {
        isRunning.signal()
    }

    // doing the job
}

您将如何使用信号量通过信号量或任何其他解决方案来实现此行为?

【问题讨论】:

    标签: swift grand-central-dispatch semaphore


    【解决方案1】:

    您可以使用wait(timeout:)now() 的超时值来测试 信号。如果信号量计数为零,则返回.timedOut, 否则返回.success(并减少信号量)。

    let isRunning = DispatchSemaphore(value: 1)
    
    func process() {
        guard isRunning.wait(timeout: .now()) == .success  else {
            return // Still processing
        }
        defer {
            isRunning.signal()
        }
    
        // doing the job
    }
    

    【讨论】:

      猜你喜欢
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 2014-10-21
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      相关资源
      最近更新 更多