2015-03-31 4 views

ответ

8

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. 
Смежные вопросы