Что такое некоторые конкретные примеры приложений, которые должны быть многопоточными или не нуждаться в них, но намного лучше?
Ответы были бы лучше, если бы в виде одного приложения на почту, так что наиболее применимые будут всплывать вверх.
Что такое некоторые конкретные примеры приложений, которые должны быть многопоточными или не нуждаться в них, но намного лучше?
Ответы были бы лучше, если бы в виде одного приложения на почту, так что наиболее применимые будут всплывать вверх.
Нет жесткого и быстрого ответа, но большую часть времени вы не увидите никакого преимущества для систем, в которых последовательность операций/вычислений является последовательной. Если, однако, проблему можно разбить на задачи, которые могут выполняться параллельно (или сама проблема является массово параллельной [как некоторые математические или аналитические проблемы]), вы можете увидеть большие улучшения.
Если ваше целевое оборудование является однопроцессорным/ядерным, вы вряд ли увидите какие-либо улучшения в многопоточных решениях (так как в любом случае есть только один поток!)
Написание многопоточного кода часто сложнее, так как вам, возможно, придется потратить время на создание логики управления потоками.
Некоторые примеры
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)
}
Серверы, как правило, многопоточные (веб-серверы, серверы радиуса, серверы электронной почты, любой сервер): вы обычно хотите иметь возможность обрабатывать несколько запросов одновременно. Если вы не хотите дождаться окончания запроса до того, как начнете обрабатывать новый запрос, у вас есть в основном два варианта:
Запуск процесса обычно более ресурсоемкий, чем прихват потока (или выбор его в пуле потоков), поэтому серверы обычно многопоточные. Более того, потоки могут связываться напрямую, поскольку они имеют одно и то же пространство памяти.
Проблема с несколькими потоками заключается в том, что их обычно сложнее закодировать, чем несколько процессов.
Существуют три класса причин, по которым применяется многопоточность:
Примеры бетона:
В наши дни ответ должен быть Любое приложение, которое может быть.
Скорость выполнения для одного потока в значительной степени достигла своего пика много лет назад - процессоры стали быстрее, добавляя ядра, а не увеличивая тактовую частоту. Были некоторые улучшения архитектуры, которые лучше используют доступные тактовые циклы, но на самом деле будущее использует потоки.
Проводится тонна исследований, направленных на поиск способов распараллеливания действий, которые мы традиционно не думали о параллелизме. Даже что-то простое, как найти подстроку внутри строки, можно распараллелить.
В принципе для многопоточности существуют две причины:
Возможность параллельного выполнения задач обработки. Это применимо только в том случае, если у вас несколько ядер/процессоров, иначе на одном ядре/процессоре компьютер замедлит задачу по сравнению с версией без потоков.
I/O, будь то сетевой ввод/вывод или ввод/вывод файлов. Обычно, если вы вызываете блокирующий вызов ввода-вывода, процесс должен дождаться завершения вызова. Поскольку процессор/память на несколько порядков быстрее, чем дисковод (а сеть еще медленнее), это означает, что процессор будет ждать долгое время. Компьютер будет работать над другими вещами, но ваше приложение не будет продвигаться. Однако, если у вас несколько потоков, компьютер будет планировать ваше приложение, а другие потоки могут выполняться. Одним из распространенных применений является графическое приложение. Затем, когда приложение выполняет ввод-вывод, поток GUI может обновлять экран, не глядя, как приложение заморожено или не отвечает. Даже на одном процессоре, когда ввод ввода-вывода в другом потоке будет ускоряться приложением.
Однопоточная альтернатива 2 - использовать асинхронные вызовы, где они немедленно возвращаются, и вы продолжаете контролировать свою программу. Затем вы должны увидеть, когда ввод/вывод завершает работу и управляет ею. Часто проще просто использовать поток для ввода-вывода, используя синхронные вызовы, поскольку они, как правило, легче.
Причиной использования потоков вместо отдельных процессов является то, что потоки должны иметь возможность обмениваться данными проще, чем несколько процессов. И иногда переключение между потоками дешевле, чем переключение между процессами.
В качестве еще одного примечания, для # 1 потоки Python не будут работать, потому что в Python может выполняться только одна команда python (известная как GIL или Global Interpreter Lock). Я использую это как пример, но вам нужно проверить свой язык. В python, если вы хотите выполнять параллельные вычисления, вам нужно сделать отдельные процессы.
Многие графические интерфейсы многопоточных. Это позволяет вам иметь более гибкий интерфейс. Например, вы можете нажать кнопку "Отмена" в любое время, пока выполняется длительный расчет.
Обратите внимание, что для этого есть другие решения (например, программа может приостанавливать вычисление каждые полсекунды, чтобы проверить, нажали ли вы кнопку Отмена или нет), но они не обеспечивают такой же уровень отзывчивости ( графический интерфейс может зависеть в течение нескольких секунд, пока файл читается или выполняется расчет).
Все ответы до сих пор сосредоточены на том, что многопоточность или многопроцессорная обработка необходимы для наилучшего использования современного оборудования.
Однако есть и тот факт, что многопоточность может значительно облегчить жизнь программисту. На работе я программирую программное обеспечение для управления производственным и испытательным оборудованием, где одна машина часто состоит из нескольких позиций, которые работают параллельно. Использование нескольких потоков для такого программного обеспечения естественным образом подходит, так как параллельные потоки хорошо моделируют физическую реальность. Нити в основном не нуждаются в обмене данными, поэтому необходимость синхронизации потоков редка, и поэтому многие из причин многопоточности затрудняются, поэтому не применяются.
Edit:
Речь идет не только об улучшении производительности, так как в основном (в 5, может быть, 10) потоках спать. Это, однако, огромное улучшение для структуры программы, когда различные параллельные процессы могут быть закодированы как последовательности действий, которые не знают друг о друге. У меня очень плохие воспоминания со времен 16-битной Windows, когда я создавал конечный автомат для каждой позиции машины, убедитесь, что ничего не займет больше нескольких миллисекунд, и постоянно передавайте управление на следующий конечный автомат. Когда были аппаратные события, которые нужно было обслуживать вовремя, а также вычисления, которые заняли некоторое время (например, FFT), тогда все будет быстро уродливо.
Непосредственно отвечая на ваш вопрос, я считаю, что в ближайшем будущем почти все приложения должны быть многопоточными. В наши дни производительность процессора не растет, что компенсируется увеличением числа ядер. Таким образом, если мы хотим, чтобы наши приложения оставались на высоком уровне производительности, нам нужно найти способы использовать все ваши компьютерные процессоры и держать их занятыми, что довольно сложно.
Это можно сделать, сообщив вашим программам, что делать, а не рассказывать им, как именно. Теперь это тема, которую я лично нахожу очень интересной в последнее время. Некоторые функциональные языки, такие как F #, могут легко распараллеливать многие задачи. Ну, не так легко, но все равно без необходимой инфраструктуры, необходимой в более сложных процедурных средах.
Просьба считать это дополнительной информацией, чтобы думать, а не пытаться ответить на ваш вопрос.
В качестве приложений, которые требуется для потоковой передачи, являются те, в которых вы хотите выполнить несколько операций одновременно. Кроме того, ни одно приложение не должно быть многопоточным.
Приложения с большой рабочей нагрузкой, которые можно легко сделать параллельными. Трудность принимать ваше выражение и делать это не следует недооценивать. Это легко, когда ваши данные, которые вы управляете, не зависят от других данных, но v. Трудно планировать работу поперечного потока, когда есть зависимость.
Некоторые примеры, которые я сделал, которые являются хорошими многопоточными кандидатами.
Например, вы хотите, чтобы ваши программы были многопоточными, когда вы хотите использовать несколько ядер и/или процессоров, даже если программы не обязательно делают много вещей одновременно.
EDIT: использование нескольких процессов - одно и то же. Какой метод использовать зависит от платформы и того, как вы собираетесь делать сообщения в своей программе и т.д.
Несмотря на легкомысленность, игры, в целом, становятся все более и более популярными каждый год. На работе наша игра использует около 10 потоков, занимающихся физикой, искусственным интеллектом, анимацией, ререйдингом, сетью и IO.
Просто хочу добавить, что следует соблюдать осторожность с помощью протектора, если вы делитесь любыми ресурсами, так как это может привести к очень странному поведению, а ваш код работает неправильно или даже потоки, блокирующие друг друга.
mutex поможет вам там, так как вы можете использовать блокировку мьютекса для областей защищенного кода, пример защищенных областей кода будет считывать или записывать в разделяемую память между потоками.
всего лишь 2 цента.
Основная цель многопоточности - отделить временные домены. Таким образом, использование происходит повсюду, где вы хотите, чтобы некоторые вещи происходили в их отдельных отдельных областях времени.