C ++ Многопоточность Замедленная скорость выполнения - PullRequest
1 голос
/ 13 апреля 2011

Я пишу многопоточное приложение на C ++.Когда поток A выполняет очень дорогую вычислительную операцию, он замедляет потоки B, C и D. Как я могу предотвратить это?

Ответы [ 5 ]

2 голосов
/ 13 апреля 2011

В Windows вы можете использовать Sleep(0), чтобы освободить остаток вашего временного интервала для других ожидающих потоков.

0 голосов
/ 13 апреля 2011

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

0 голосов
/ 13 апреля 2011

Есть несколько способов:

  • Как предложено RedX, добавьте Sleep(0) во внутренний цикл потока A, чтобы он чаще давал время. Это дешевое и ленивое решение.
  • Лучше было бы изменить приоритет потока. Когда вы вызываете CreateThread, передайте CREATE_SUSPENDED, чтобы поток не запустился немедленно. Затем вызовите SetPriorityClass, чтобы установить для потока более низкий приоритет, а затем ResumeThread.
0 голосов
/ 13 апреля 2011

Обратите внимание, что вы можете установить приоритеты потоков (SetThreadPriority)

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

  • вы можете настроить, сколько «задач» будет взято из очереди для обработки одним махом
  • вы можете заблокировать очередь (использовать семафоры + условие условия), чтобы вы могли временно запретить захват новых задач.
  • теперь вы можете распределить нагрузку между несколькими рабочими (скажем, если потоки B, C, D временно простаивают, они могут начать снимать работу с потока A; очень полезно на Quad-core + рабочий стол)

$ 0,02

0 голосов
/ 13 апреля 2011

Трудно сказать, не видя код, поэтому я могу лишь дать вам совет понизить приоритет темы А.Это можно сделать с помощью функции SetThreadPriority .

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