Я пытался настроить многопоточное приложение. Один из потоков работает как фон для передачи данных. Прямо сейчас этот поток автоматически убивает себя после того, как работа сделана. Как-то мне нужно убить этот поток в другом потоке, чтобы немедленно остановить его работу. Есть ли какой-нибудь API или метод для этого?
Цель C: как убить поток, находясь в другом потоке в Objective-C?
Ответы:
bbum правильный, вы не хотите просто убивать поток. Вы можете более безопасно убить процесс, потому что он изолирован от остальной системы. Поскольку поток разделяет память и ресурсы с остальным процессом, его прекращение может привести к разного рода проблемам.
Итак, что ты должен делать?
Единственный правильный способ справиться с этим - иметь возможность, чтобы ваш основной поток отправлял сообщение рабочему потоку, предлагая ему выйти. Рабочий поток должен периодически проверять наличие этого сообщения и добровольно завершать работу.
Легкий способ сделать это - использовать флаг, логическую переменную, доступную для обоих потоков. Однако, если у вас несколько рабочих потоков, вам может понадобиться что-то более сложное.
Разве это не плохая идея? (Если другой поток выполняет что-то в критическом разделе, он может оставить материал в несогласованном состоянии.) Не могли бы вы просто установить некоторую переменную общего флага и попросить другой поток периодически проверять ее, чтобы убедиться, что она следует остановиться?
Вы могли бы передавать сообщения между передним и фоновым потоками, потенциально используя что-то вроде this, чтобы облегчить передачу сообщений.
Если вы используете pthread, попробуйте использовать pthread_kill, я уже давно пробовал, это не сработало для меня, в основном, если поток находится в каком-то блокирующем вызове, он не сработает.
Это правда, что убивать поток - не лучший вариант, если вы ищете какое-то решение для какой-то проблемы, вы можете попробовать это.
На мой взгляд, лучше позволить потоку идти своим чередом естественным образом. Трудно дать гарантии относительно эффекта от попытки убить поток.
exit()
, это убьет весь процесс. Просто позвольте основной функции потока завершиться естественным образом, вызвавreturn
. Если вам нужно, чтобы он быстрее отвечал на запрос завершения, рабочий поток должен чаще проверять флаг. 19.12.2009