Я пишу многопоточное приложение C++. Когда поток A выполняет очень дорогостоящую операцию, он замедляет потоки B, C и D. Как я могу предотвратить это?C++ Многопотоковая скорость выполнения Slow-Down
ответ
В окнах вы можете использовать Sleep(0)
, чтобы освободить оставшуюся часть вашего таймлиса для других потоков, которые ждут вас.
То есть семантика POSIX также – sehe
Это то, что я бы предложил - _but_ будет замедлять поток A, поэтому не следует использовать, если вычисление критично по времени. – tom502
Учитывая, что у него есть 4cores, невозможно накладные расходы процессора одного потока замедлить других, чтобы «спать» действительно помогло. Вероятно, у него есть некоторая плохая замкнутая семантика. * Возможно использование ложного обмена, но было бы трудно заметить с помощью тестов производительности * –
Трудно сказать, не видя кода, поэтому я могу дать вам совет снизить приоритет Thread A. Это можно сделать, используя функцию SetThreadPriority.
Обратите внимание, что вы можете установить приоритеты потоков (SetThreadPriority
)
Кроме того, я советую в BackgroundWorker выбирает свою работу из очереди. Очередь может быть использована как способ удушения расчетов:
- вы можете настроить, сколько «задачи» взяты из очереди на обработку одним маха
- вы можете заблокировать очереди (использование семафоров + условие события), чтобы вы могли временно предотвратить сбор новых задач.
- теперь вы можете распределить нагрузку между несколькими рабочими (например, если поток B, C, D временно бездействует, они могут начать поднимать отрабатывают нить А, очень полезно на четырехъядерной + рабочий стол)
$ 0,02
Добавлено больше советов – sehe
есть несколько способов:
- Как предложил RedX добавить
Sleep(0)
во внутреннем контуре Пронизывайте, чтобы иметь его дать время все чаще. Это дешевое и ленивое решение. - Лучше было бы изменить приоритет потока. Когда вы вызываете
CreateThread
, пройдитеCREATE_SUSPENDED
, чтобы поток не начинался немедленно. Затем вызовитеSetPriorityClass
, чтобы установить нить в нижний приоритет, а затемResumeThread
.
При более низком приоритете он также будет прерван другими системными процессами.В режиме сна (0) вы все равно можете иметь приоритет для всех своих потоков и использовать «Сон», чтобы дать оставшуюся часть времени этим потокам. (Надеюсь, это имеет смысл) – RedX
@RedX, ваш комментарий неправильный. Когда вы 'Sleep (0)' текущий исполняемый поток приостанавливается, но нет абсолютно никакой гарантии, что следующий поток будет запущен из вашего процесса. Таким образом, вы потенциально уступаете свое время системным потокам в любом случае. –
Возможно, вам также захочется взглянуть на то, что ваш поток, связанный с вычислением, дает процессору другие потоки. См. this post для различных способов сделать это.
- 1. Скорость выполнения программы C
- 2. Многопотоковая рекурсивная программа C++
- 3. C++ многопотоковая блокировка мьютекса «reset»
- 4. Скорость выполнения Java
- 5. C++ - как улучшить скорость выполнения этих методов
- 6. C# Скорость выполнения: равно (==) vs not equal (! =)
- 7. iOS многопотоковая синхронизация
- 8. iPhone Simulator Intermittent Slowdown
- 9. JQuery .Stop() slowdown
- 10. Weird Winsock recv() slowdown
- 11. Url spam slowdown
- 12. GLSL Fradment shader slowdown
- 13. Веб-сайт Slowdown
- 14. jQuery slowdown removeClass
- 15. DirectWrite FPS SlowDown
- 16. скорость выполнения теста webdriver
- 17. Многопотоковая петля через 4D-массив C++
- 18. Сроки выполнения Скорость Python кода
- 19. Как увеличить скорость моего выполнения
- 20. Java Многопотоковая синхронизация (объект)
- 21. Многопотоковая задержка клавиатуры LWJGL
- 22. Что такое многопотоковая парадигма?
- 23. WPF DataGrid Многопотоковая авария
- 24. Многопотоковая фиксация для SVN
- 25. многопотоковая остановка в java
- 26. Python многопотоковая синхронизация
- 27. Java Slowdown на OSX 10.9
- 28. Drupal chat slowdown мое приложение
- 29. What Causeing Slowdown Magento Speed
- 30. Как указатели увеличивают скорость выполнения?
Сколько ядер имеет ваша система? Если у вас меньше 4 ядер, то некоторые ядра придется делиться между несколькими потоками, а это значит, что стоимость одного потока повлияет на остальные ... –
У меня есть 4 ядра. Это intel i7. – rossb83
4 ядра и одна нить замедляют другие? Либо вы неправильно измеряете, либо потоки логически блокируют друг друга (то есть, это не время вычисления, замедляющее его). Таким образом, «спать», вероятно, не поможет. –