максимальное количество потоков - Как определить, работают ли ваши потоки C ++ параллельно? - PullRequest
0 голосов
/ 02 мая 2018

Я недостаточно осведомлен в многопоточном программировании. В моей программе на C ++ я создаю 10 потоков, каждый из которых отвечает за обработку части данных в реальном времени, передаваемых в систему. В конечном итоге внутри main () обработанные данные из всех потоков объединяются. Насколько мне известно, точное количество потоков, которые могут выполняться параллельно, определяется числом ядер на сокет x потоков на сокет x сокетов, которое в моем случае равно 8 (4 x 2 x 1). Так ли это, что в моем приложении с 10 потоками не происходит палатализации, и планировщик выполняет переключение между различными потоками? если нет, то есть ли способ определить это? или, по крайней мере, я могу знать, сколько миллисекунд занимает этот обмен? Поскольку мое приложение работает с данными в реальном времени, важно убедиться, что все потоки работают параллельно.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Я пока не могу добавлять комментарии, поэтому расстался с ответом.

или, по крайней мере, я могу знать, сколько миллисекунд занимает этот обмен

В Windows это значение по умолчанию 10 - 20 мс С небольшой хитростью вы можете изменить это на 1 - 2 мс

#include <Mmsystem.h>
#pragma comment(lib,"winmm.lib")
timeBeginPeriod(1); // set system clock to 1ms from default 10ms

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

SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL);

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

В Linux по умолчанию уже 1 мс (динамический), но вы можете переключаться между различными планировщиками.

0 голосов
/ 02 мая 2018

«Насколько мне известно точное количество потоков ...»

в некотором роде - есть также гиперпоточность, которая мешает вещам; и есть еще тот факт, что C ++ может быть запущен не на ПК. (т.е. встроенные устройства), которые будут иметь статический номер.

"это то, что делает планировщик"

Да. Но не только ваши темы; все потоки ОС и других приложений также контролируются этим.

или, по крайней мере, я могу знать, сколько миллисекунд занимает этот обмен

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

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

Это не ваше дело о том, как работают ваши потоки; это зависит от ОС. На вашем компьютере есть более важные задачи, чем ваша программа. Например, ОС требуется время обработки для обработки любых запросов памяти, сделанных приложениями.

Некоторые ОС действительно могут делать это более специализированным способом; Например, Qnix - это ОС реального времени; но это происходит за счет других затрат.

Одна вещь, которую вы можете быть уверены, хотя; в том случае, если у вас максимальное количество возможных потоков, работающих как 8; и вы создаете 10; у вас не будет их всех, работающих параллельно. Возможно, вы захотите взглянуть на некоторые библиотеки, которые помогут убедиться, что созданные вами потоки всегда заняты; boost::asio например

...