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

Может ли кто-нибудь объяснить потоки мне?

Я рассматриваю возможность добавления потоков приложений в мое приложение для ускорения выполнения, но проблема в том, что я честно не знаю, как использовать потоки, или то, что считается "потокобезопасным". Например, как движок игры использует потоки в своих процессах рендеринга или в каких контекстах нити будут рассматриваться только как помеха? Может ли кто-нибудь указать путь к некоторым ресурсам, чтобы помочь мне узнать больше или объяснить здесь?

4b9b3361

Ответ 1

Это очень широкая тема. Но вот что я хотел бы знать, если бы я ничего не знал о потоках:

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

  • Они могут делиться памятью! Здесь могут возникать проблемы. Я рассказываю об этом более подробно в более позднем пункте.

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

  • Потоковая защита означает, что нет условий гонки, что является термином, используемым для проблем, возникающих, когда выполнение вашего процесса зависит от времени (то, что вы не хотите полагаться на). Например, если у вас есть потоки A и B, оба увеличивают общий счетчик C, вы можете увидеть случай, когда A читает значение C, тогда B считывает значение C, затем A перезаписывает C с помощью C+1, затем B перезаписывает C с помощью C+1. Обратите внимание, что C только один раз увеличивается один раз!

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

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

Ответ 2

Есть четыре вещи, которые вы должны знать о потоках.

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Секции потоков в Эффективная Java и Очистить код являются хорошим знакомством с темами и их подводными камнями.

Ответ 8

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

Я очень рекомендую вам потратить время на чтение книги. Параллельное программирование на Java: принципы и шаблоны дизайна Дуга Ли: http://gee.cs.oswego.edu/dl/cpj/

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

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

Ответ 9

Поскольку исходный пост очень широк и также помечен С++, я думаю, что следующие указатели имеют значение:

Антони Уильямс, поддерживающий библиотеку Boost Thread, работает над книгой под названием "С++ Concurrency в действии", описание которой вы можете найти . Первая (вводная) глава доступна бесплатно в формате pdf здесь.

Кроме того, Herb Sutter (известный, среди прочего, для своей серии "Исключительный С++" ) пишет книгу под названием "Эффективный Concurrency", многие статьи которой доступны в черновом варианте здесь.