2010-01-30 4 views
1

Когда мы будем использовать потоки в нашем приложении. Другими словами, когда нужно преобразовать однопоточное приложение в многопоточное приложение. Будучи разработчиком, я думаю, что задача, которая мешает вашему приложению работать бесперебойно. Эта задача может обрабатываться потоком. Подобно тому, как мы получаем данные GPS непрерывно. Я думаю, есть еще несколько причин для создания потока в вашем приложении. Пожалуйста, поделитесь своим мнением.Однопоточное многопоточное приложение

Спасибо.

+0

Сделайте это более читаемым, пожалуйста. Это очень трудно понять. – oneat

+1

Я думаю, что в основном он хочет знать, какие стимулы были бы связаны с преобразованием однопоточного приложения в многопоточное. Последнее предложение его вопроса - «самый легкий» для понимания. – SyntaxT3rr0r

+1

@oneat, в соответствии с их профилем «Читатель» из Нью-Дели, поэтому английский не является их «первым» языком, следовательно, менее совершенной грамматикой. Никогда не помешает предположить, что чей-то первый язык может быть не английским. =) – Rob

ответ

3

Причины я могу думать с верхней частью моей головы (и я уверен, что есть больше):
1. Разгрузка партии работы рабочего потока так что ваша программа может либо продолжить отвечать на ввод данных пользователя или вы можете продолжить запуск другого кода, который не полагается на эту работу.
2. Обработка ввода/вывода, в частности, серверной и сетевой связи, когда время отклика является переменным или неизвестным.
3. Параллельная обработка данных, где можно подразделить работу на отдельные, не зависящих от единиц работы
4. Таймер связанных с работой т.е. «каждый 500ms проверить, если х изменилось»

Однако, переход на многопоточное или параллельное программирование не обходится без ошибок, особенно если эти потоки должны получать доступ к общим данным, поэтому количество вопросов на SO около mutexes и thread synchronisation!

+0

Да, это ответ, который я искал ... :) – Reader

2

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

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

Такое очень неоптимизированное поведение можно четко увидеть с помощью монитора ЦП.

Итак, один ответ на ваш вопрос «когда мы должны использовать поток?» просто «когда вы искусственно замедляете свое программное обеспечение, заставляя его работать только на одном ядре».

В качестве побочного примечания это очень интересно, потому что в этом примере сложность сортировочного алгоритма остается O (n log n), но «эффект параллелизации» дает потрясающее ускорение скорости.

Другие причины могут заключаться в том, что в некоторых случаях правильная многопоточность вашего приложения, например, с использованием хорошо продуманной схемы procuder/consumer, также может помочь уменьшить разновидность ресурсов.

1

Основная идея заключается в том, что вы мощи выгоды от использования нескольких потоков, когда что-то может быть сделано параллельно (и у вас есть несколько ядер, чтобы использовать.) Подумайте embarrassingly parallel проблем. Цель здесь состоит в том, чтобы сделать еще работать в то же время. Читайте статьи Х. Саттера о Effective Concurrency.

Люди часто подключаются отзывчивость пользовательского интерфейса к потоку. Это не обязательно так и зависит от возможностей конкретного OS/framework/API, но обычное использование - выполнять длительные операции, такие как открытие/сохранение файла в фоновом потоке, поэтому пользовательский интерфейс не замирает на время действия.

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

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

0

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

2

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

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

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

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

1

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

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

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

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