Как попросить семафор вернуться немедленно, а не ждать сигнала? - PullRequest
0 голосов
/ 20 октября 2018

Я хотел бы эффективно реализовать это поведение:

Функция запрошена (пользователем).Зная, что эта функция также автоматически повторно вызывается таймером, я хотел бы убедиться, что функция возвращается всякий раз, когда она уже запущена.

В псевдокоде:

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 голосов
/ 21 октября 2018

Вы можете использовать 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
}
...