2012-06-13 3 views
2

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

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


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

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

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


while (true) { /*Nothing*/ } 

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

for(;;); 

sleep(100000000); 

while(true) { sleep(1); } 
+0

Редактора: Линии намеренно указывают отдельные тесты. Код не должен был быть сгруппирован –

ответ

2

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

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

+0

Спасибо. Является ли код, который я написал, блокирующим?Другой ответ, похоже, не предполагает. –

+0

Это зависит от того, что вы подразумеваете под блокировкой. Когда каждая из строк, которые вы отправили, выполняется потоком, этот поток застрянет там и не будет двигаться дальше. Хотя технически строка 'sleep (100000000);' вернется через 1157 дней. –

+1

У меня есть кое-какие ожидания! Спасибо за разъяснения. –

0

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

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

+0

Да, я написал другой ответ на этот вопрос. Но интересно понять, что я все равно не блокирую –

+2

Они блокируют поток от продолжения. Не все из них блокируются в том смысле, что поток не исполняется, хотя сон делает. Некоторые из них блокируются занятой петлей навсегда. –

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