Кто-то может объяснить нити мне? [закрытый]

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

12
задан Orm 23 January 2010 в 01:06
поделиться

10 ответов

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

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

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

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

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

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

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

32
ответ дан 2 December 2019 в 03:38
поделиться

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

  1. Темы похожи на процессы, но они разделяют память.

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

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

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

2
ответ дан 2 December 2019 в 03:38
поделиться

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

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

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

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

1
ответ дан 2 December 2019 в 03:38
поделиться

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

1
ответ дан 2 December 2019 в 03:38
поделиться

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

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

Разделы резьбы в обоих эффективных java и чистый код являются хорошими введения в потоки и их подводные камни.

1
ответ дан 2 December 2019 в 03:38
поделиться

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

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

1
ответ дан 2 December 2019 в 03:38
поделиться

Там есть хорошая книга, Java Changulary на практике , , http://www.javaconcurrencyinpractice.com/ .

0
ответ дан 2 December 2019 в 03:38
поделиться

Так как вопрос с меткой «Java», я предполагаю, что вы знакомы с Java, в этом случае это Отличный вводный учебник http://java.sun.com/docs/books/tutorial/essential/Concurrency/

1
ответ дан 2 December 2019 в 03:38
поделиться

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

Энтони Уильямс, разработчик Boost Библиотека потоков работает над книгой «Параллелизм в C ++ в действии», описание которой вы можете найти здесь . Первая (вводная) глава доступна бесплатно в формате pdf здесь .

Кроме того, Херб Саттер (известный, среди прочего, своей серией «Исключительный C ++») написал книгу под названием «Эффективный параллелизм», многие статьи которой доступны в черновой форме здесь .

1
ответ дан 2 December 2019 в 03:38
поделиться

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

Я настоятельно рекомендую вам найти время, чтобы прочитать книгу Concurrent Programming in Java: Design Principles and Patterns by Doug Lea: http://gee.cs.oswego.edu/dl/cpj/

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

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

1
ответ дан 2 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: