Подтвердить что ты не робот

Почему я должен использовать поток или использовать процесс?

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


Изменить

Все, что (или если) будет действовать по-разному с одноядерным и многоядерным, также будет полезно.

4b9b3361

Ответ 1

Вы предпочли бы несколько потоков по нескольким процессам по двум причинам:

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

Пример:

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

Ответ 2

Хорошо, кроме преимуществ использования потока над процессом, например:

Преимущества:

  • Гораздо быстрее создать поток, чем процесс.
  • Намного быстрее переключиться между потоками, чем переключать между процессами.
  • Данные об объемах потоков легко

Учесть также несколько недостатков:

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

Что касается важной части вашего вопроса "Когда я должен использовать поток?"

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

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

Ответ 3

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

Использование процесса означает, что вам также потребуется Inter Process Communication (IPC) для получения данных в процессе и из процесса. Это хорошо, если процесс должен быть изолирован.

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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