Можно ли безопасно использовать NSTask вне основного потока? - PullRequest
0 голосов
/ 12 июня 2010

Вчера я где-то читал, что NSTask не безопасен для потоков , и это меня беспокоит, потому что я запускаю NSTask в NSThread и до сих пор не сталкивался с какими-либо проблемами с ним.1003 *

Мой код организован следующим образом

A: main thread -> B: worker thread -> C: worker task

C: The worker task is a commandline program.
B: The worker thread can start/stop the worker task and send it commands.
A: The main thread can send commands to the worker thread.

Если NSTask предполагается использовать только в основном потоке, то я рассматриваю перемещение кода запуска / остановки NSTask в основной поток,только для предотвращения возможных проблем с потоками.

Можно ли использовать NSTask вне основного потока?

А если нет, то какие могут быть проблемы с потоками с NSTask?

Ответы [ 2 ]

4 голосов
/ 13 июня 2010

Я где-то читал, что NSTask не является потокобезопасным

Это не то, что говорит эта страница.В нем говорится, что вы получите уведомление о завершении процесса в том же потоке, из которого вы его запустили, что говорит о том, что NSTask знает о потоках и пытается делать правильные вещи.

Проблема одного из редакторовэта страница была связана с тем, что они начали свой процесс с потока, а затем позволили потоку умереть.Это вызвало сбой, потому что инфраструктура больше не могла доставлять уведомление о завершении процесса нужному потоку.

Сводка по безопасности потока (закладка, что) говорит нечто подобное, перечисляя NSTask всписок классов, о которых говорится:

В большинстве случаев вы можете использовать эти классы из любого потока, если вы используете их только из одного потока за раз.Обратитесь к документации класса для получения дополнительной информации.

Документация NSTask не говорит ничего о потоках, поэтому кажется, что NSTask является одним из «большинства случаев»: вы можете использовать задачу изнить вы создали его.Не используйте ту же задачу в другом потоке, и (как отмечено выше) убедитесь, что поток длится, по крайней мере, столько же времени, сколько процесс задачи.

Однако я отмечу, что в большинстве случаевнет необходимости запускать задачу в отдельном потоке.Отдельные процессы, как правило, выполняются на других процессорах, как и другие потоки в вашем процессе, и цикл выполнения отлично справляется с мультиплексированием множества небольших событий и поддержанием отзывчивости пользовательского интерфейса.Вы можете использовать NSFileHandle readInBackgroundAndNotify метод , если вам нужно прочитать выходные данные из задачи.Возможно, вы сможете полностью обрезать свои рабочие потоки.

Альтернатива, как предложил Eimantas, заключается в использовании NSOperation: иметь операцию, которая просто запускает определенную задачу и ожидает завершения этой задачи (возможно, синхронное чтениевыход из него).Операция завершается после завершения задачи.

0 голосов
/ 13 июня 2010

Да, может, но я предлагаю вам использовать NSOperation. Это КВО-агностик (в отличие от резьбовых NSTask). Также вы можете посмотреть шаблон проектирования приемной, касающийся КВО и резьбовой среды (на случай, если вам нужен КВО).

...