2010-01-23 3 views
12

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

+2

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

+3

Быть тупым. Забудьте о добавлении потоков. Это похоже на то, что у вас есть основное понимание первой помощи и желание сделать операцию на мозге. Вернитесь назад и изучите основы. –

+0

Этот вопрос слишком широк, чтобы получить ответ любым разумным способом. – Kev

ответ

31

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

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

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

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

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

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

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

+0

Это очень помогло мне! Спасибо! – Orm

+0

+1 хорошее введение в тему. – Grundlefleck

+0

@Orm: очень приветствуется; Я рад, что это было полезно. – danben

0

Есть хорошая книга, Java Concurrency in Practice, http://www.javaconcurrencyinpractice.com/.

+0

Несмотря на то, что это потрясающая книга, она предполагает предварительное знание основных механизмов параллелизма в Java, о которых, вероятно, не готов квестчик. – Grundlefleck

+0

Правильно, я забыл, что это не включает вступление. –

1

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

+2

Темы * могут * ускорить ваше приложение, при определенных условиях. Например, когда серийные, блокирующие задачи можно разделить на параллельные задачи. Эффект увеличивается на многоядерных системах, что становится нормой. Рассмотрим задачу, которая должна выполнить запрос TCP/IP и ждать ответа. Если эта задача блокируется в одном потоке, 10 из них будут занимать 10 раз. Если это параллелизировано, это может быть сокращено до чуть более 1 раза. – Grundlefleck

+0

... или это только исправление терминологии? :) – Grundlefleck

+0

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

1

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

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

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

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

+2

Несмотря на то, что все безгосударственные поточно-безопасные, поточно-безопасные НЕ означают безгражданство – danben

+0

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

1

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

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

1

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

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

Разделы резьбы как в Effective Java, так и в Clean Code являются отличными вложениями в темы и их подводные камни.

+4

Первое правило обобщений: не обобщать. – danben

+5

Многопоточность * делает * ускорение, когда у вас есть параллелизуемая задача с процессором и есть несколько процессоров (или ядер). Разделите работу на * n * потоки и выполните задание примерно в 1/n раз, где * n * меньше или равно числу процессоров. – Wyzard

+1

Это правда и более применимо в наши дни с более многоядерными процессорами, чем когда-либо. Дело принято. Но использование потоков просто для оптимизации даже в многопроцессорных средах - острое предложение, желательно только в том случае, если ваша архитектура * обязательно * асинхронна, например, при написании какого-либо сервера, который будет выделять нескольких сотрудников и т. Д. –

2

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

  1. Нити как процессы, но они делят память.

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

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

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

1

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

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

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

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

1

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

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

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

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