Задача блокировки резьбы C

69
3

Я только что прочитал этот ответ (ответ с тех пор был удален), и я уверен, что видел, как приложения зависали после того, как они висели, и то, что я прочитал, имеет смысл.


Если вы заблокируете основной поток слишком долго, OS убьет ваше приложение.



Однако Я написал несколько тестов и обнаружил, что ни одно из них не вызвало сбой приложения после ожидания приблизительно 2-5 минут на каждом. Точки останова подтвердили, что я запускаю основной основной поток.


    Может кто-нибудь подтвердить или опровергнуть то, что я прочитал, или я просто выбрал много вариантов, которые не блокируются?


    Если я выбрал опции без блокировки, может кто-нибудь объяснить, почему они не блокируются?


while (true) { /*Nothing*/ }

while (true) { NSLog(@"nothing"); }

for(;;);

sleep(100000000);

while(true) { sleep(1); }

спросил(а) 2020-04-03T23:04:23+03:00 5 месяцев, 4 недели назад
1
Решение
70

iOS будет убивать ваше приложение только в том случае, если оно слишком длится в некоторых методах UIApplicationDelegate, таких как application:didFinishLaunchingWithOptions: или applicationDidEnterBackground:. Обычно вы возвращаетесь на 5 секунд, хотя это не применяется для отладочных версий вашего приложения.

Блокирование основного потока вне этих методов не приведет к прекращению вашего приложения.

ответил(а) 2020-04-03T23:21:34.612501+03:00 5 месяцев, 4 недели назад
41

Ответ, который вы имеете в виду, неверен, авария связана с тем, что у него заканчивается память, а не потому, что он блокирует основной поток. Я считаю, что ни один из приведенных вами примеров не блокирует поток. Путь к блокировке потока будет заключаться в использовании рекурсии или вызове dispatch_sync из основного потока с главной очередью в качестве аргумента. Это создаст тупик, но я не думаю, что ваше приложение будет прекращено из-за этого (хотя я могу ошибаться).

Итак, почему эти блокировки? Зависит от того, как вы определяете блокировку. Все приведенные вами примеры, кроме 4-го, не позволяют вашему коду перейти к следующей строке, что совершенно нормально. sleep(10000000) еще слабее этого, потому что он будет правильно возвращаться после заданного количества секунд, так почему это может вызвать какие-либо проблемы?

ответил(а) 2020-04-03T23:04:23+03:00 5 месяцев, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема