2010-12-15 5 views
2

В принципе, мне интересно, полезно ли использование потоков или необходимо, а точнее, использование и ситуации, в которых вы его используете. Я мало знаю о потоковом и никогда не использовал его (я в основном использую C#), и задался вопросом, есть ли какие-либо выгоды от производительности или стабильности, если вы их используете. Если бы кто-нибудь был так любезным объяснить, я был бы признателен.Нужна ли/нужна?

ответ

6

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

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

+1

+1 Это анекдотический, но открыть диспетчер задач на любом окне Windows. В меню «Вид» добавьте столбец «Темы» на вкладку «Процесс». Тогда вы увидите, что подавляющее большинство процессов (обычно 90 +%) используют несколько потоков. На моей коробке 71 из 76 (93%) запущенных процессов многопоточных. –

+0

@Matt Davis: только для статистики: 55/58 threaded here ;-) – zerkms

0

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

+0

'Adding 'здесь выглядит не подходящим примером, imho, так как' + '- очень дешевая операция. Я думаю, что «сжатие видео» может быть лучшим. – zerkms

+0

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

+4

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

1

нет уверенности в стабильности :). Я бы посоветовал вам получить базовое представление о потоке, но не прыгать, чтобы использовать его в любом реальном производстве, пока у вас не возникнет настоящая потребность. у вас есть C#, поэтому не уверен, что вы создаете сайты или winforms.

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

хороший учебник, чтобы справиться с этой ситуацией, чтобы look at the backgroundworker class in c#, поскольку это даст вам первый аромат в этом пространстве, а затем вы можете пойти оттуда

0

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

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

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

+1

Даже на одном потоке с сердечником может значительно ускорить выполнение приложения. Например, когда вы работаете с медленным сторонним источником данных (ftp, http, hdd и т. Д.). – zerkms

1

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

Но несколько лет назад производители процессоров прекратили увеличивать часы процессора из-за физических пределов (например, рассеивания тепла). И вместо этого они начали добавлять дополнительные ядра к процессорам.

Теперь, если ваше приложение работает только в одном потоке, оно не может использовать полный процессор (например, из 4-х ядер используется только 1).

Итак, чтобы полностью использовать процессор, мы должны приложить усилия и разделить задачу на нескольких ступенях. Для ASP.NET это уже сделано для нас архитектурой ASP.NET и IIS.

Посмотрите здесь The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software

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