如何要求信号量立即返回而不是等待信号?

时间:2018-10-19 21:06:42

标签: swift grand-central-dispatch semaphore

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

(用户)要求运行一个功能。知道计时器也会自动重复调用此功能,因此我想确保该功能在运行时就返回。

使用伪代码:

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
}

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

1 个答案:

答案 0 :(得分:2)

您可以使用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
}