在等待超时时发送信号量信号

时间:2015-03-31 06:26:29

标签: ios objective-c cocoa swift grand-central-dispatch

dispatch_semaphore_wait遇到超时时,它会自动发出信号(递增计数),还是要手动完成?

1 个答案:

答案 0 :(得分:11)

dispatch_semaphore_wait()递减计数信号量并等待 如果结果值小于零。如果发生超时,请执行此操作 递减是相反的,因此您不必手动调整计数。

从文档中可以看出这一点(对我而言),但与之相符 负数指示线程正在等待的事实 信号。另请参阅the source code中的此评论:

// If the internal value is negative, then the absolute of the value is
// equal to the number of waiting threads. ...

您也可以通过打印debugDescription来验证它 信号量,输出显示当前值:

let sem = dispatch_semaphore_create(0)

NSLog("%@", sem.debugDescription)
// <OS_dispatch_semaphore: semaphore[0x100514a70] = { ..., value = 0, orig = 0 }>
// --> Initial value is 0

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(NSEC_PER_SEC)),
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
        NSLog("%@", sem.debugDescription)
        // <OS_dispatch_semaphore: semaphore[0x100514a70] = { ..., value = -1, orig = 0 }>
        // --> One thread is waiting, value is -1.
}

let ret = dispatch_semaphore_wait(sem, dispatch_time(DISPATCH_TIME_NOW, 2*Int64(NSEC_PER_SEC)))
NSLog("%@", sem.debugDescription)
// <OS_dispatch_semaphore: semaphore[0x100514a70] = { ..., value = 0, orig = 0 }>
// --> Time out, value is 0 again.