Что происходит, когда pthreads ожидает в mutex_lock / cond_wait? - PullRequest
6 голосов
/ 13 июля 2011

У меня есть программа, которая должна получить максимальную отдачу от моего процессора.

Это многопоточная обработка через pthreads, которая хорошо выполняет свою работу, за исключением того факта, что они "только" загружают мои ядра примерно до 60% нагрузки.на мой взгляд, этого недостаточно.

Я ищу причину и спрашиваю себя (и тем самым вас), являются ли блокирующие функции mutex_lock / cond_wait кандидатами?

Что происходит, когда потокне может работать в такой функции?

  • pthread переключается на другой поток, который он обрабатывает, или
  • возвращает ли поток свое время системе, и если последний имеет место, можетЯ изменяю это поведение?

С уважением,

Никто

Дополнительная информация Параметр - это одна из главных тем, которая заполняет пул задач и бесчисленное количество рабочих, которыеполучить оттуда задания и ожидать условного сообщения, которое сигнализируется через широковещательную рассылку после выполнения сериализованного вычисления.Они продолжают значения из этого расчета, пока не закончат, доставят свою почту и получат следующую работу ...

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

В типичной современной реализации pthreads каждый поток управляется ядром, в отличие от отдельного процесса.Любой блокирующий вызов, такой как pthread_mutex_lock или pthread_cond_wait (но также, скажем, read), отдаст свое время системе.Затем система найдет другой подходящий поток для планирования, будь то в вашем процессе или другом процессе, и запустит его.

Если ваша программа занимает только 60% ЦП, она, скорее всего, заблокирована при вводе-выводечем в операциях pthread, если вы не сделали что-то слишком гранулярное с вашими операциями pthread.

0 голосов
/ 13 июля 2011

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

...