Цель C: Как убить поток, находясь в другом потоке в Objective-C? - PullRequest
2 голосов
/ 18 декабря 2009

Я пытался настроить многопоточное приложение. Один из потоков работает в качестве фона, чтобы получить некоторую передачу данных. Прямо сейчас этот поток автоматически убивает себя после того, как его работа сделана. Каким-то образом мне нужно убить этот поток в другом потоке, чтобы немедленно остановить его работу Есть ли API или метод для этого?

Ответы [ 6 ]

11 голосов
/ 18 декабря 2009

Короче, ты не можешь. Или, точнее, не стоит. Никогда и ни при каких обстоятельствах.

У потока A нет абсолютно никакого способа узнать точное состояние потока B, когда A убивает B. Если B удерживает какие-либо блокировки или находится в середине системного вызова, или вызывает системный каркас, когда A убивает его, то итоговое состояние вашего приложения будет недетерминированным.

На самом деле - это будет несколько детерминировано, поскольку вы в значительной степени гарантированы, что сбой произойдет когда-нибудь в ближайшем будущем.

<Ч />

Если вам нужно завершить поток B, вы должны сделать это контролируемым образом. Наиболее распространенным способом является наличие cancel флага или метода, который можно установить / вызвать. Затем поток B должен периодически проверять этот флаг или проверять, был ли вызван метод, очистить все, что он делает, и затем завершиться.

То есть вам придется изменить логику в потоке B для поддержки этого.

3 голосов
/ 18 декабря 2009

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

Итак, что ты должен делать?

Единственный правильный способ справиться с этим - это дать вашему основному потоку способ отправить сообщение рабочему потоку, сообщив ему о выходе Рабочий поток должен периодически и добровольно проверять это сообщение.

Простой способ сделать это с помощью флага, логической переменной, доступной обоим потокам. Если у вас несколько рабочих потоков, вам может понадобиться что-то более сложное.

0 голосов
/ 04 ноября 2010

По моему личному мнению, лучше всего, чтобы поток проходил естественно. Трудно дать гарантии о том, что вы пытаетесь уничтожить поток.

0 голосов
/ 18 декабря 2009

Если вы используете pthread, тогда вы пытаетесь с помощью 'pthread_kill', я пытался долго назад, это не работало для меня, в основном, если поток находится в каком-то блокирующем вызове, он не будет работать.

Это правда, что уничтожение потока не является хорошим вариантом, если вы ищете какое-то решение для какой-то проблемы, то вы можете попробовать это.

0 голосов
/ 18 декабря 2009

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

0 голосов
/ 18 декабря 2009

Разве это не плохая идея? (Если другой поток находится в процессе выполнения чего-либо в критической секции, он может оставить вещи в несогласованном состоянии.) Не могли бы вы просто установить некоторую переменную общего флага и попросить другой поток периодически проверять это, чтобы увидеть, должен остановиться?

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