Что такое DispatchSemaphore и что будет, если забыть signal()?
Суть
DispatchSemaphore — счётный семафор GCD. wait() уменьшает счётчик и блокирует поток, если счётчик стал отрицательным; signal() увеличивает и будит одного ждущего. DispatchSemaphore(value: N) ограничивает секцию N потоками; value: 0 используют, чтобы дождаться события.
Если забыть signal(), ждущий поток никогда не проснётся. Последствия зависят от того, кто ждёт:
- главный поток — приложение зависает, watchdog убивает его через несколько секунд;
- поток GCD-пула — поток утекает навсегда, при повторении — thread explosion и исчерпание пула;
- поток кооперативного пула Swift Concurrency — пул маленький (примерно по числу ядер), один заблокированный поток уже может остановить все задачи.
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep