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

Какие приложения должны быть многопоточными?

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

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

4b9b3361

Ответ 1

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

Если ваше целевое оборудование является однопроцессорным/ядерным, вы вряд ли увидите какие-либо улучшения в многопоточных решениях (так как в любом случае есть только один поток!)

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

Некоторые примеры

  • Обработка изображений часто может выполняться параллельно (например, разбивайте изображение на 4 и выполняйте работу в 1/4 раза), но это зависит от запуска алгоритма, чтобы убедиться, что это делает чувство.
  • Одевание анимации (из 3DMax и т.д.) является массово параллельным, так как каждый кадр может быть предоставлен независимо друг другу - это означает, что 10 или 100 компьютеров могут быть соединены вместе, чтобы помочь.
  • GUI программирование часто помогает иметь по меньшей мере два потока при медленном выполнении, например. обрабатывая большое количество файлов - это позволяет интерфейсу оставаться отзывчивым, пока рабочий выполняет тяжелую работу (в С# примером является BackgroundWorker).

GUI - интересная область, так как "отзывчивость" интерфейса может поддерживаться без многопоточности, если рабочий алгоритм сохраняет основной графический интерфейс "живым", предоставляя ему время, в терминах API Windows (до .NET и т.д.), это может быть достигнуто с помощью примитивного цикла и нет необходимости в нарезке:

MSG msg;
while(GetMessage(&msg, hwnd, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);

    // do some stuff here and then release, the loop will come back
    // almost immediately (unless the user has quit)
}

Ответ 2

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

  • Запустить процесс с несколькими потоками
  • Запуск нескольких процессов

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

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

Ответ 3

Существуют три класса причин, по которым применяется многопоточность:

  • Выполнение Concurrency для повышения производительности вычислений. Если у вас есть проблема, которая может быть разбита на части, и вы также имеете более одного исполняемого элемента (ядро процессора), а затем отправляете части в отдельные потоки - это путь к одновременному использованию двух или более ядер одновременно.
  • Concurrency операций ЦП и операций ввода-вывода. Это похоже на мышление на первое, но в этом случае цель заключается в том, чтобы заняться ЦП и также выполнять операции ввода-вывода (то есть: O), движущиеся параллельно, а не чередующиеся между ними.
  • Дизайн и отзывчивость программы. Многие типы программ могут использовать потоки в качестве преимущества разработки программы, чтобы сделать программу более восприимчивой к пользователю. Например, программа может взаимодействовать через GUI, а также делать что-то в фоновом режиме.

Примеры бетона:

  • Microsoft Word: отредактируйте документ, пока фоновая грамматика и проверка орфографии работают, чтобы добавить все зеленые и красные оттенки подчеркивания.
  • Microsoft Excel. Автоматические пересчеты фона после редактирования ячейки.
  • Веб-браузер. Отправка нескольких потоков для загрузки каждой из нескольких ссылок HTML параллельно при загрузке одной страницы. Ускоряет загрузку страниц и максимизирует пропускную способность данных TCP/IP.

Ответ 4

В наши дни ответ должен быть Любое приложение, которое может быть.

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

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

Ответ 5

В принципе для многопоточности существуют две причины:

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

  • I/O, будь то сетевой ввод/вывод или ввод/вывод файлов. Обычно, если вы вызываете блокирующий вызов ввода-вывода, процесс должен дождаться завершения вызова. Поскольку процессор/память на несколько порядков быстрее, чем дисковод (а сеть еще медленнее), это означает, что процессор будет ждать долгое время. Компьютер будет работать над другими вещами, но ваше приложение не будет продвигаться. Однако, если у вас несколько потоков, компьютер будет планировать ваше приложение, а другие потоки могут выполняться. Одним из распространенных применений является графическое приложение. Затем, когда приложение выполняет ввод-вывод, поток GUI может обновлять экран, не глядя, как приложение заморожено или не отвечает. Даже на одном процессоре, когда ввод ввода-вывода в другом потоке будет ускоряться приложением.

Однопоточная альтернатива 2 - использовать асинхронные вызовы, где они немедленно возвращаются, и вы продолжаете контролировать свою программу. Затем вы должны увидеть, когда ввод/вывод завершает работу и управляет ею. Часто проще просто использовать поток для ввода-вывода, используя синхронные вызовы, поскольку они, как правило, легче.

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

В качестве еще одного примечания, для # 1 потоки Python не будут работать, потому что в Python может выполняться только одна команда python (известная как GIL или Global Interpreter Lock). Я использую это как пример, но вам нужно проверить свой язык. В python, если вы хотите выполнять параллельные вычисления, вам нужно сделать отдельные процессы.

Ответ 6

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

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

Ответ 7

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

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

Edit:

Речь идет не только об улучшении производительности, так как в основном (в 5, может быть, 10) потоках спать. Это, однако, огромное улучшение для структуры программы, когда различные параллельные процессы могут быть закодированы как последовательности действий, которые не знают друг о друге. У меня очень плохие воспоминания со времен 16-битной Windows, когда я создавал конечный автомат для каждой позиции машины, убедитесь, что ничего не займет больше нескольких миллисекунд, и постоянно передавайте управление на следующий конечный автомат. Когда были аппаратные события, которые нужно было обслуживать вовремя, а также вычисления, которые заняли некоторое время (например, FFT), тогда все будет быстро уродливо.

Ответ 8

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

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

Просьба считать это дополнительной информацией, чтобы думать, а не пытаться ответить на ваш вопрос.

Ответ 9

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

Ответ 10

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

Некоторые примеры, которые я сделал, которые являются хорошими многопоточными кандидатами.

  • сценарии запуска (например, ценообразование на производные производные, статистика)
  • массовое обновление файлов данных (например, добавление значения/записи в 10 000 записей)
  • другие математические процессы

Ответ 11

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

EDIT: использование нескольких процессов - одно и то же. Какой метод использовать зависит от платформы и того, как вы собираетесь делать сообщения в своей программе и т.д.

Ответ 12

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

Ответ 13

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

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

всего лишь 2 цента.

Ответ 14

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