Примеры задач для многопоточности

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

поэтому я хочу начать с малого. Каковы некоторые практические проблемы, на разных уровнях сложности, которые были бы полезны для многопоточной практики? (И не надуманные, непрактичные примеры, которые вы видите в книгах, не посвященных параллелизму).

какие книги или ссылки вы бы рекомендовали сосредоточить на параллелизме и дать углубленные проблемы а дела?

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

7 ответов


Если у вас есть достаточно времени, чтобы инвестировать, я бы рекомендовал книгу" параллелизм: государственные модели и Java-программы, 2-е издание " Джеффа Мэджи и Джеффа Крамера, John Wiley & Sons 2006

вы можете игнорировать часть Java, если вы используете какой-то другой язык

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

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


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


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

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


полностью игнорируя ваш запрос, я предлагаю вам посмотреть на Седа (staged event driven architecture) как способ подумать о создании многопоточного конвейера производителей и потребителей.


Я не уверен, что вы ищете. Но в реальной ситуации на предприятии мы обычно используем какую-то структуру обмена сообщениями, когда делаем вещи потребителей производителей. Типично на Java, это JMS. И вы можете использовать отличный Весенние Рамки чтобы помочь вам в этом.


Если вы вообще работаете с Java (и, возможно, даже если это не так), вы обязательно должны прочитать Параллелизм Java На Практике.


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

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

(обратите внимание, что" круговой буфер " является довольно c-центральным термином, коренящимся в относительно прямой манипуляции блоком памяти. Класс Queue Python реализует тот же основной принцип, ориентированный на список, и я уверен, что многие другие языки имеют концептуально похожие конструкции под несколько разными именами...)