0

Я использую семафоры и GCD в приложении Objective-C macOS. У меня есть общий сценарий:Хорошая практика отправить задержанный semaphore_signal в семафор в MacOS Grand Central Dispatch App?

dispatch_semaphore_t fd_sema = dispatch_semaphore_create(0); 

dispatch_async(dispatch_get_main_queue(), ^{ 

     // Perform some activity 
     // But can potentially never complete 

     dispatch_semaphore_signal(fd_sema); 
}); 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     dispatch_semaphore_signal(fd_sema); 
}); 

dispatch_semaphore_wait(fd_sema, DISPATCH_TIME_FOREVER); 

В принципе, здесь я пытаюсь получить таймаут на операцию. Учитывая, что аргумент dispatch_semaphore_wait может быть только сейчас или навсегда, я использую блок dispatch_after для реализации тайм-аута. Считаете ли вы, что это хорошая практика или это может привести к проблемам и сбоям? Спасибо за любую помощь.

+2

Может ли ваша деятельность действительно * никогда не завершить? Тогда вы можете постоянно тратить поток, помещая его в глобальную очередь отправки. Поскольку это может быть медленным, почему вы сейчас делаете это в ** основной ** очереди? Кажется, плохая идея. – jtbandes

ответ

3

У вас возникла идея, что тайм-аут на dispatch_semaphore_wait() может быть только сейчас или навсегда? Это неправильно. Вы можете передать результат от dispatch_time() так же, как вы используете с dispatch_after(). Поэтому вам не нужно самостоятельно выполнять тайм-аут.

+0

Это было под моими глазами! Вероятно, было поздно ночью :), но я попытался взглянуть на заголовки, и я наткнулся на непрозрачную структуру времени, которую можно было установить только задокументированным способом или сейчас. Наверняка, это была не просто структура времени, используемая здесь. Большое спасибо ! –

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

  • Нет связанных вопросов^_^