2009-08-29 4 views
2

У меня есть вызов сторонней библиотеки C++, которую я поместил в свой собственный поток (в настоящее время используется NSThread). Я хотел бы дать пользователю возможность остановить выполнение этого потока. (Я хорошо осведомлен о всех проблемах, которые это может вызвать, но я все еще хочу это сделать.)Как убить нить с помощью Objective C?

Согласно Apple's Thread Programming Guide, в Cocoa есть возможности для этого. Это правда для iPhone тоже, или мне приходится полагаться на потоки Posix для достижения моей цели?

Приветствия

MrMage

+4

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

+0

Даже если поток, который я хотел бы убить (рабочий поток), не использует ни один из объектов основного потока и наоборот? Мне сказал разработчик указанной библиотеки, что он с радостью использует такую ​​отмену потока, чтобы остановить свои рабочие потоки, и что он не испытывает серьезных проблем. – MrMage

+0

Если его библиотека использует любые вызовы системной библиотеки любым способом, то принудительное уничтожение потока приведет к неопределенному поведению. Это включает в себя malloc(), даже. Даже если он сейчас работает, продолжает ли он работать с обновлениями программного обеспечения и изменениями архитектуры, это совершенно другая проблема. – bbum

ответ

10

Правильный способ остановить ваш поток выполнения, чтобы спросить его хорошо, чтобы остановить выполнение. Затем в вашем потоке вы слушаете такие запросы и слушаете их в соответствующее время.

В самом странице вы связаны говорит:

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

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

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