Можно ли создать реальный неотсоединенный (присоединяемый) поток в iPhone OS? - PullRequest
0 голосов
/ 22 октября 2009

Интересно, что произойдет, когда я создаю объединяемый поток для записи больших данных на «диск». Теперь, документы говорят, что я могу сделать это, используя потоки POSIX. Ницца! Но: Другой парень из Apple сказал, что у приложения есть около 5 секунд, чтобы выйти, когда пользователь нажимает кнопку «Домой». Так что для моего понимания «настоящий» неотсоединенный поток имеет смысл предотвратить повреждение данных, но когда iPhone OS просто убивает процесс через 5 секунд, я думаю, это не имеет особого смысла.

Но: без неотключенных потоков, могло ли бы приложение завершиться немедленно, а не быть убитым через 5 секунд? Или это просто дурной миф, и присоединяемый поток POSIX будет обеспечивать полную обработку данных перед завершением работы приложения?

Не волнуйтесь, я не планирую делать что-то такое, что не позволит пользователю отключить приложение. Я просто хочу понять это правильно.

1 Ответ

0 голосов
/ 22 октября 2009

Я не уверен, что использование присоединяемого потока позволяет отложить завершение приложения, пока ваш поток не будет завершен и вы не присоединитесь к нему. Возможно нет. Вы можете использовать потоки POSIX вместо NSThread или NSOperation / NSOperationQueue, но вам все равно придется учитывать возможность прекращения работы приложения пользователем.

Теперь прекращение может произойти одним из двух возможных способов:

1) приложение получает сигнал SIGTERM, который вы можете перехватить через applicationWillTerminate: метод, который затем является обработчиком сигнала SIGTERM;

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

Если SIGTERM - единственный сигнал, отправляемый для завершения приложения, тогда вы сможете продолжить работу в потоке, чтобы сохранить данные и выйти изящно. Однако может случиться так, что по истечении тайм-аута (те 5 секунд, которые вы упомянули) приложение также получает SIGKILL, и это событие вызывает его немедленное завершение. Это может быть тем, что происходит на самом деле, когда пользователь нажимает кнопку «Домой»: iPhone OS отправляет приложение SIGTERM, запускает таймер, а по истечении времени ожидания отправляет SIGKILL. Но ничто в документации не подтверждает это (или опровергает это, насколько мне известно).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...