Модель потоков - PullRequest
       14

Модель потоков

1 голос
/ 28 апреля 2009

Существует ли модель потоков, которая работает примерно так:

while thread = nextAvailableThread():
  thread.doWork(data)

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

Мне особенно интересно использовать это в C ++, но я был бы рад, если бы что-нибудь подобное существовало на любом языке?

РЕДАКТИРОВАТЬ: Пул потоков выглядит так же, как я думал. Итак, какие-нибудь рекомендации для реализации C ++?

Ответы [ 5 ]

3 голосов
/ 28 апреля 2009

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

3 голосов
/ 28 апреля 2009

Похоже, вы ищете пул потоков. Здесь - статья со ссылками на конкретные реализации на разных языках (во внешних ссылках внизу).

РЕДАКТИРОВАТЬ: Здесь пример C ++.

1 голос
/ 28 апреля 2009

Вы можете проверить параллельную библиотеку задач , если используете .Net.

Библиотека действительно проста в использовании, но также имеет множество мощных функций. В простейшей форме вы бы использовали его так:

Parallel.For(0, 100, delegate(int i) { 
   a[i] = a[i]*a[i]; 
});

И прекрасно то, что он будет выполнять каждую задачу всякий раз, когда ядро ​​будет готово к выполнению. На n -ядерной машине он будет иметь только n активных потоков в любой момент.

Если у вас есть время, вы можете увидеть эту сессию от Даниэля Мота. Даже если вы не используете .Net, интересно увидеть некоторые примеры того, как эти проблемы решаются там.

1 голос
/ 28 апреля 2009

Попробуйте это: threadpool

0 голосов
/ 28 апреля 2009

Модель производителя / потребителя, вероятно, то, что вы ищете.

В самой базовой конфигурации вам нужно 2 одновременных компонента: очередь thradsafe и пул рабочих потоков. Вы можете найти хорошие примеры этого в Интернете.

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