Обойти ли ограничение потоков в Grand Central Dispatch?
СGrand Central Dispatchможно легко выполнить трудоемкую задачу в неосновном потоке, избежать блокировки основной части и поддерживать отзывчивость интерфейса пользователя. Просто с помощьюdispatch_async
и выполнить задачу в глобальной параллельной очереди.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// code
});
Однако что-то звучит слишком хорошо, чтобы быть правдой, так как у этого обычно есть свои недостатки. После того, как мы часто используем это в нашем проекте приложений для iOS, недавно мы обнаружили, чтона нем ограничение в 64 потока. Как только мы достигнем предела, приложение будет зависать / зависать. Приостановив приложение с Xcode, мы видим, что основной поток поддерживается.semaphore_wait_trap
Поиск в Интернете подтверждает, что другие тоже сталкиваются с этой проблемой, но пока что не найдено решение этой проблемы.
Достигнут жесткий предел потока отправки: 64 (слишком много потоков отправки заблокировано в синхронных операциях)
Еще один вопрос о переполнении стека подтверждает, что эта проблема возникает при использованииdispatch_sync
а такжеdispatch_barrier_async
тоже.
Вопрос:
Поскольку Grand Central Dispatch имеет ограничение в 64 потока, есть ли обходной путь для этого?
Заранее спасибо!