Я рассматриваю возможность добавления в приложение приложений для работы с потоками, чтобы ускорить выполнение, но проблема в том, что я честно понятия не имею, как использовать потоки, или то, что считается «потокобезопасным». Например, как движок игры использует потоки в своих процессах рендеринга или в каких контекстах нити будут рассматриваться только как помеха? Может кто-то указать путь к некоторым ресурсам, чтобы помочь мне узнать больше или объяснить здесь?Может ли кто-нибудь объяснить мне темы?
ответ
Это очень общая тема. Но вот то, что я хотел бы знать, если я ничего не знал о потоках:
Они являются единицами исполнения в рамках одного процесса, которые происходят «параллельно» - это означает, что текущая единица исполнения в процессоре быстро переключаются. Это может быть достигнуто с помощью различных средств. Переключение называется «переключение контекста», и с этим связаны некоторые накладные расходы.
Они могут делиться памятью! Здесь могут возникать проблемы. Я рассказываю об этом более подробно в более позднем выпуске.
Преимущество распараллеливания приложения заключается в том, что логика, использующая разные части машины, может происходить одновременно. То есть, если часть вашего процесса связана с I/O-привязкой, а часть его связана с ЦП, интенсивная операция ввода-вывода не должна ждать, пока не будет выполнена интенсивная работа с ЦП. Некоторые языки также позволяют запускать потоки одновременно, если у вас многоядерный процессор (и, следовательно, параллелизируйте операции с интенсивным использованием ЦП), хотя это не всегда так.
поточно-означает, что нет условия гонки, что это термин, используемый для проблем, которые возникают, когда выполнение вашего процесса зависит от времени (то, что вы не хотите, чтобы полагаться на). Например, если у вас есть темы
A
иB
и приращение общего счетчикаC
, вы можете увидеть случай, когдаA
считывает значениеC
, тоB
считывает значениеC
, тоA
перезаписываетC
сC+1
, тоB
перезаписываетC
сC+1
. Обратите внимание, чтоC
только один раз увеличивается один раз!Пара общих способов избежать условий гонки включает в себя синхронизацию, что исключает взаимный доступ к общему состоянию или просто не имеет никакого общего состояния вообще. Но это всего лишь верхушка айсберга. Потоковая безопасность - довольно широкая тема.
Надеюсь, что это поможет! Поймите, что это было очень быстрое введение в то, что требует хорошего обучения. Я бы рекомендовал найти ресурс о многопоточности на предпочитаемом вами языке, что бы это ни случилось, и дать ему подробное чтение.
Это очень помогло мне! Спасибо! – Orm
+1 хорошее введение в тему. – Grundlefleck
@Orm: очень приветствуется; Я рад, что это было полезно. – danben
Есть хорошая книга, Java Concurrency in Practice, http://www.javaconcurrencyinpractice.com/.
Несмотря на то, что это потрясающая книга, она предполагает предварительное знание основных механизмов параллелизма в Java, о которых, вероятно, не готов квестчик. – Grundlefleck
Правильно, я забыл, что это не включает вступление. –
Нити не ускоряют применение. Алгоритмы ускоряют работу приложений. При необходимости потоки могут использоваться в алгоритмах.
Темы * могут * ускорить ваше приложение, при определенных условиях. Например, когда серийные, блокирующие задачи можно разделить на параллельные задачи. Эффект увеличивается на многоядерных системах, что становится нормой. Рассмотрим задачу, которая должна выполнить запрос TCP/IP и ждать ответа. Если эта задача блокируется в одном потоке, 10 из них будут занимать 10 раз. Если это параллелизировано, это может быть сокращено до чуть более 1 раза. – Grundlefleck
... или это только исправление терминологии? :) – Grundlefleck
Да, я учился в классе алгоритмов и постоянно изучаю алгоритмы, но я хотел расширить свои горизонты немного больше, когда многоядерные процессоры стали нормой. – Orm
Хорошо, что кто-то, вероятно, ответит на это лучше, но потоки предназначены для обработки фона, которая не затормозит пользовательский интерфейс.Вы не хотите прекращать прием ввода клавиатуры или ввода мыши и сообщать пользователю, «всего лишь один момент, я хочу закончить это вычисление, это займет всего несколько секунд». (И все же его удивительные, сколько раз коммерческие программы делают это.
Что касается потокобезопасности, то это означает, что функция не имеет какого-либо внутреннего сохраненного состояния. Если бы это было так, вы не могли бы одновременно использовать несколько потоков.
Что касается программирования потоков, вам просто нужно начать делать это, а затем вы начнете сталкиваться с различными проблемами, уникальными для программирования потоков, например одновременным доступом к данным, и в этом случае вам нужно решить использовать какой-либо метод синхронизации таких как критические секции или мьютексы или что-то еще, причем каждый из них имеет несколько разные нюансы в своем поведении.
Что касается различий между процессом s и потоки (которые вы не запрашивали) - это объект уровня ОС, тогда как потоки связаны с программой. В некоторых случаях ваша программа может захотеть создать процесс, а не поток.
Несмотря на то, что все безгосударственные поточно-безопасные, поточно-безопасные НЕ означают безгражданство – danben
Извините, я в придирчивом настроении ... «... потоки предназначены для фоновой обработки, которая не будет замораживать пользовательский интерфейс «. - это выглядит так, как будто это исключительная цель потоковой передачи, что определенно неверно, хотя это одно из видов использования. – Grundlefleck
Threads - это просто способ одновременного выполнения нескольких действий (при условии, что платформа, на которой они запускаются, может выполнять параллельное выполнение). Безопасность потоков - это просто (ну, ничто с потоками действительно просто), следя за тем, чтобы нити не влияли друг на друга вредоносными способами.
В общем, вы вряд ли увидите, что системы используют несколько потоков для рендеринга графики на экране из-за многочисленных проблем с производительностью и сложности, которые могут возникнуть из-за этого. Другие задачи, связанные с управлением состоянием (или AI), потенциально могут быть перемещены в отдельные потоки.
Первое правило нарезания резьбы: не резьба. Второе правило пронизывания: если вам нужно нарушить правило 1, не делайте этого. Третье правило: хорошо, хорошо, что вам нужно использовать потоки, поэтому, прежде чем приступать к вашей ловушке, поймите о блокировке и общесистемных проблемах, таких как тупик и оживление.
Понимать, что нить не ускоряет ничего, это полезно только для фоновых длительных процессов, позволяющих пользователю делать что-то еще с приложением. Если вы должны разрешить пользователю взаимодействовать с приложением, в то время как приложение делает что-то еще в фоновом режиме, например, опрос сокета или ожидание входа в другом месте приложения, тогда вам действительно понадобится потоковая передача.
Разделы резьбы как в Effective Java, так и в Clean Code являются отличными вложениями в темы и их подводные камни.
Первое правило обобщений: не обобщать. – danben
Многопоточность * делает * ускорение, когда у вас есть параллелизуемая задача с процессором и есть несколько процессоров (или ядер). Разделите работу на * n * потоки и выполните задание примерно в 1/n раз, где * n * меньше или равно числу процессоров. – Wyzard
Это правда и более применимо в наши дни с более многоядерными процессорами, чем когда-либо. Дело принято. Но использование потоков просто для оптимизации даже в многопроцессорных средах - острое предложение, желательно только в том случае, если ваша архитектура * обязательно * асинхронна, например, при написании какого-либо сервера, который будет выделять нескольких сотрудников и т. Д. –
Есть четыре вещи, которые вы должны знать о потоках.
Нити как процессы, но они делят память.
Темы часто имеют аппаратное обеспечение, ОС и языковую поддержку, что может сделать их лучше процессов.
Есть много суетливых мелочей, которые необходимо поддерживать потокам (например, замки и семафоры), чтобы они не получали память, которую они разделяют, в несогласованное состояние. Это делает их немного трудными в использовании.
Блокировка не является автоматическим (на языках, которые я знаю), поэтому вы должны быть очень осторожны с памятью, которую они (неявно) используют.
Поскольку вопрос помечается «Java», я предполагаю, что вы знакомы с Java, в этом случае это отличный вводный учебник http://java.sun.com/docs/books/tutorial/essential/concurrency/
Орм, большой вопрос, чтобы спросить. Я думаю, что всем серьезным программистам следует узнать о потоках, потому что в конечном итоге вы получите : по крайней мере подумайте над их использованием, и вы действительно хотите быть готовым, когда это произойдет. Ошибки параллелизма могут быть невероятно тонкими, и лучший способ избежать их - знать, какие идиомы безопасны (-ish).
Я настоятельно рекомендую вам взять время, чтобы прочитать книгу Параллельное программирование в Java: принципы дизайна и шаблоны Дуг Lea: http://gee.cs.oswego.edu/dl/cpj/
Lea принимает время не только научить вас концепции, но и чтобы показать вам правильные и неправильные способы использования параллельных программных примитивов (в Java, но также полезно для любой другой среды, использующей параллелизм стиля блокировки/сигнализации с разделяемой памятью). Больше всего он учит уважению к сложности параллельного программирования.
Я должен добавить, что этот стиль параллельного программирования является наиболее распространенным, но не единственным подходом. Также есть передача сообщений, что более безопасно, но заставляет вас структурировать ваш алгоритм по-разному.
Поскольку оригинальный пост очень широк, а также с тегами C++, я думаю, что следующие указатели являются релевантными:
Энтони Уильямс, хранитель библиотеки подталкивания Thread, работает над книгой под названием «++ Параллельный C в действии ", описание которого вы можете найти here. Первая (вводная) глава доступна бесплатно в формате pdf here.
Кроме того, Herb Sutter (известный, среди прочего, для своей серии «Исключительный C++») пишет книгу под названием «Эффективная параллельность», многие статьи которой доступны в черновом варианте here.
- 1. Может ли кто-нибудь объяснить CMVideoFormatDescriptionGetCleanAperture() мне?
- 2. Может ли кто-нибудь объяснить мне StandardScaler?
- 3. Может ли кто-нибудь объяснить мне numpy.indices()?
- 4. Может кто-нибудь объяснить мне обработку исключений?
- 5. Может ли кто-нибудь объяснить мне этот код, пожалуйста,
- 6. Может ли кто-нибудь объяснить этот мод переписать мне?
- 7. Может ли кто-нибудь объяснить мне сетку «Золотая сетка»?
- 8. Может ли кто-нибудь объяснить мне popen() с режимом записи
- 9. Может ли кто-нибудь помочь мне объяснить эти тайминги метода?
- 10. Может ли кто-нибудь объяснить часть этого opencv-кода мне?
- 11. Может ли кто-нибудь объяснить мне, как работать самостоятельно?
- 12. Может ли кто-нибудь объяснить мне следующий пример?
- 13. Может ли кто-нибудь объяснить мне внутренности десериализации?
- 14. Может ли кто-нибудь объяснить мне концепцию секционированных таблиц улья?
- 15. Может ли кто-нибудь объяснить мне, как сделать отзывчивый дизайн?
- 16. Может ли кто-нибудь объяснить мне эту директиву по паролю?
- 17. Может ли кто-нибудь объяснить мне этот метод разворота javax?
- 18. Может ли кто-нибудь объяснить мне функции обратного вызова?
- 19. Может ли кто-нибудь объяснить мне параметр RETURN_VALUE?
- 20. Может ли кто-нибудь объяснить мне независимость в байесовских сетях?
- 21. Может ли кто-нибудь объяснить мне этот код?
- 22. может ли кто-нибудь объяснить этот алгот для перестановки мне?
- 23. Может ли кто-нибудь объяснить мне сложность алгоритма Рабина-Карпа?
- 24. Может ли кто-нибудь объяснить мне эти функции Haskell?
- 25. Может ли кто-нибудь объяснить мне метод .getClass() в java
- 26. Рекурсивный метод тайны - Может ли кто-нибудь объяснить это мне?
- 27. Может ли кто-нибудь объяснить мне точку RAII?
- 28. Может ли кто-нибудь объяснить мне этот кусок кода?
- 29. Может ли кто-нибудь объяснить мне формат запроса Dblink
- 30. Может ли кто-нибудь объяснить мне эту команду Oracle SQL?
Это очень общий. Поток - это просто рабочий, который выполняет команды. «Безопасность потоков» гарантирует, что два или более потока не вызовут проблем при взаимодействии. Что касается игрового движка, использующего потоки ... существует около миллиона способов сделать это. –
Быть тупым. Забудьте о добавлении потоков. Это похоже на то, что у вас есть основное понимание первой помощи и желание сделать операцию на мозге. Вернитесь назад и изучите основы. –
Этот вопрос слишком широк, чтобы получить ответ любым разумным способом. – Kev