2013-06-12 5 views
2

У меня проблемы с помощью dispatch_semaphore_wait (..) когда семафор был создан со значением больше 0ИОС семафор ждать не ждать

sema = dispatch_semaphore_create(2); 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    //signals here 
}); 

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
dispatch_release(sema); 

не должны ждать приходится ждать два сигнала? В приведенном выше коде он не ждет вообще, и поэтому вызывается релиз, а результат - сбой!

ответ

4

Нет, это не так, как это работает. Поток будет блокироваться при третьем ожидании, пока не будет сигнализирован один из двух предыдущих. Это система, указывающая, сколько потоков может получить доступ к ресурсу сразу. Больше информации here.

Если вы хотите подождать так, как вы описали, вы можете использовать класс NSCondition, я думаю.

5

Используйте группу отправки вместо семафора, чтобы получить это поведение.

Инициализируйте группу до размера 2, дважды позвонив по номеру dispatch_group_enter(), и dispatch_group_wait() будет ожидать два звонка до dispatch_group_leave(), прежде чем он вернется.

Смежные вопросы