Многопоточность контроля потока - PullRequest
1 голос
/ 31 января 2010

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

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

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

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

Если кто-то может помочь, это было бы очень признательно.

Использование Windows и Visual C ++. Примечание: мне не нужно беспокоиться о традиционных проблемах доступа с потоками, каждый из которых полностью независим от друг друга, это больше похоже на пакетную обработку, а не на истинное многопоточность программы.

Спасибо,

-Faken

Ответы [ 3 ]

2 голосов
/ 31 января 2010

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

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

Вы можете работать со стандартным пулом потоков, созданным в Windows, используя Windows Thread Pool API.

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

2 голосов
/ 31 января 2010

Не создавайте темы явно. Создайте пул потоков, см. Пулы потоков и поставьте свою работу в очередь, используя QueueUserWorkItem . Размер пула потоков должен определяться количеством доступных аппаратных потоков (количество ядер и соотношение гиперпоточности) и соотношением ЦП и ввода-вывода, которое выполняют ваши рабочие элементы. Контролируя размер пула потоков, вы контролируете максимальное количество одновременных потоков.

0 голосов
/ 31 января 2010

Здесь так много всего сказано.
Есть несколько способов
Вам следует создать только столько дескрипторов потоков, сколько вы планируете запустить одновременно, а затем использовать их по завершении. (Поиск пула потоков).
Это гарантирует, что у вас никогда не будет слишком много бега одновременно. Это поднимает вопрос о финансировании, когда поток завершается. Вы можете вызвать обратный вызов непосредственно перед завершением потока, где параметр в этом обратном вызове является дескриптором потока, который только что закончил. Для этого используйте Boost bind и boost. Когда вызывается обратный вызов, найдите другую задачу для этого дескриптора потока и перезапустите поток. Таким образом, все, что вам нужно сделать, это добавить в список «задачи для выполнения» и обратный вызов удалит задачи для вас. Нет необходимости в опросе и не нужно беспокоиться о слишком большом количестве потоков.

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