2015-06-29 2 views
2

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

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

Edit: Поскольку правила нарезания резьбы зависят от операционной системы, я хотел бы услышать мнения по следующему тоже:

  1. Android
  2. Linux
  3. IOS
+0

Вам необходимо позаботиться о ваших потоках. Используйте механизм связи между потоками при выходе из сигнального конца основного потока в другие потоки, затем присоедините потоки и подождите, пока они не будут остановлены. Это «чистый» способ. И сначала спросите себя, действительно ли вам нужны потоки (если он делает I/O, вам лучше использовать что-то еще большую часть времени) – mguijarr

+0

что делать, если я использую реализацию блокирующей очереди, которая ждет нажатия? Я не хочу давать токен выхода в очереди. –

+1

почему? это самый чистый подход – mguijarr

ответ

1

Нет . С большинством нетривиальных ОС вам не нужно явно/изящно прекращать потоки приложений при жизни, если только это не требует конкретной и неотложной необходимости.

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

Ваш Linux/ОС Windows очень хорош в прекращении потоков в любом состоянии на ядре и освобождении ресурсов, таких как потоки стеков, кучи, дескрипторы объектов OS/fd и т. Д. При завершении процесса. Это было миллионы часов тестирования в системах по всему миру, что вряд ли когда-либо испытает ваш собственный код пользователя. Если вы можете это сделать, вы должны позволить ОС делать то, что хорошо.

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

Остерегайтесь преждевременной остановки.

2

Это зависит от того, что делает нить.

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

  • писать файл
  • отправки сетевых сообщений

Но ОС будет

  • закрыть al л обрабатывает приложение владеет
  • релиз любые замки
  • все бесплатно памяти
  • близко любой открытый файл
  • и т.д ...

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

Я знаю this is true for Windows, и я был бы очень удивлен, если бы он был другим на других ОС. К счастью, время, когда приложение, которое не выпустило все ресурсы, может повлиять на всю систему.

+0

Удивительный! Но в следующем сценарии: Поток построен в конструкторе класса и убит в деструкторе. Мы можем реализовать некоторую логику, где деструктор останавливается до отправки сообщений или написания файлов. Если мы прекратим уничтожение, мы прекратим убийство, пока наша работа не будет завершена, учитывая, что класс имеет срок службы приложения. –

+0

Кроме того, мне все еще нужно получить гарантии относительно мобильных ОС –