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

Posted

技术标签:

【中文标题】如何要求信号量立即返回而不是等待信号?【英文标题】: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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何要求信号量立即返回而不是等待信号?的主要内容,如果未能解决你的问题,请参考以下文章

[APUE]进程控制(中)

进程-

如何使方法发送信号并在返回之前等待插槽?

GSM返回'99'时如何确定信号强度?

查找在 POSIX 信号量上阻塞的任务数

如何监测 QT 信号?