Какой шаблон дизайна для многопоточности следует использовать? - PullRequest
2 голосов
/ 31 декабря 2010

Я начинаю с boost для многопоточности для переноса моей программы в окно (из pthread из linux). Кто-нибудь знаком с этим? Любое предложение о том, какой шаблон я должен использовать?

Вот требования:

  • У меня много потоков, большую часть времени выполняющих одно и то же с разными параметрами,
  • Все потоки разделяют область памяти, называемую "критическая память" (массив)
  • Синхронизация должна выполняться с «барьером» на определенной итерации
  • требует максимально возможного распараллеливания, если это возможно, т.е. хорошее планирование с одинаковым приоритетом для всех потоков (в настоящее время я позволяю процессору выполнять свою работу, но я выясняю, что boost имеет пул потоков с thread.schedule (), не уверенный, должен ли я использовать)

Для pthread каждая вещь - это функция, так что я не уверен, что мне следует преобразовать ее в объект, в чем же тогда преимущество? Немного путаницы после прочтения этого урока http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html так много вариантов для использования ...

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 31 декабря 2010

портирование должно быть достаточно простым:

  • У меня много тем большую часть времени. работает то же самое с разными параметры,

создать необходимое количество потоков с функтором, который связывает ваши различные параметры, например:

boost::thread thr1(boost::bind(your_thread_func, arg1, arg2));
  • Все темы разделяют область памяти называется «критическая память» (массив)

здесь ничего особенного, просто используйте boost :: mutex для синхронизации доступа (или другой тип мьютекса, если у вас есть особые требования)

  • Синхронизация должна быть сделана с «барьер» на определенной итерации

использовать boost::barrier: http://www.boost.org/doc/libs/1_45_0/doc/html/thread/synchronization.html#thread.synchronization.barriers

  • requires highest parallelization if possible i.e good scheduling with same priority for all threads ( currently I let CPU does the job, but I find out that boost has threadpool with thread.schedule() not sure if i should use )

CPU? возможно вы имели ввиду планировщик ОС. это самое простое решение, которое в большинстве случаев удовлетворительное. Threadpool не является частью Boost и я не знаком с этим. boost thread не имеет планировщика.

Я ничего не знаю о вашей задаче и ее потенциале распараллеливания, поэтому я предполагаю, что она может быть распараллелена на большее количество потоков, чем у вас есть ядра. теоретически, чтобы получить максимальную производительность, вам нужно плавно распределить вашу работу по числу потоков = числу ваших ядер (включая виртуальные). это не самая простая задача, и вы можете использовать готовые решения. например Intel Threading Building Blocks (лицензия GPL) или даже Boost Asio . Несмотря на то, что основным назначением является сетевое взаимодействие, у Asio есть диспетчер, и вы можете использовать его в качестве пула потоков. Просто создайте оптимальное количество потоков (количество ядер?), Добавьте объект boost :: asio :: io_service и запустите его из всех потоков. опубликовать работу в пуле потоков с помощью io_service :: post ()

0 голосов
/ 02 января 2011

По моему мнению, использование порта win32 pthread является более простым способом решения таких задач.

EDITED :

В прошлом месяцеЯ преобразовал исходный код 1-летнего проекта в pthread-w32 из Boost.Thread.Boost.Thread предоставляет много полезного, но если вы работаете со старыми модными подпрограммами потоков, Boost.Thread может быть слишком хлопотным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...