Я пытаюсь ускорить часть кода, уже настроив фоновые потоки для решения одной конкретной задачи. Когда пришло время решить мою задачу, я хотел бы разбудить эти потоки, выполнить задание и снова заблокировать их в ожидании следующей задачи. Задача всегда одна.
Я пытался использовать условные переменные (и мьютекс, который должен идти с ними), но в итоге я замедлил свой код, а не ускорил его; в основном это произошло из-за того, что вызовы всех необходимых функций очень дороги (pthread_cond_wait/pthread_cond_signal/pthread_mutex_lock/pthread_mutex_unlock
).
Нет смысла использовать пул потоков (которого у меня тоже нет), потому что это слишком общая конструкция; здесь я хочу обратиться только к моей конкретной задаче. В зависимости от реализации я бы также заплатил штраф за производительность очереди.
Есть ли у вас какие-либо предложения для быстрого пробуждения без использования mutex
или con_var
?
Я думал о потоках настройки, таких как таймеры, читающие atomic variable
; если переменная установлена в 1, потоки будут выполнять работу; если установлено значение 0, они перейдут в спящий режим на несколько микросекунд (я бы начал с микросекундного сна, так как хотел бы избежать использования spinlocks
, который может быть слишком дорогим для процессора). Что вы думаете об этом? Любое предложение очень ценится.
Я использую Linux, gcc, C и C++.
lock
, потому что оно вызывается главным потоком послеsignal
. Остаетсяunlock
, который является быстрым, иcond_signal
, и последовательность возврата изcond_wait
, которая должна быть примерно такой же быстрой, как любой путь пробуждения в pthreads. Это не значит, что нет более быстрого способа, но если конечной целью не является определенная задержка, то этого вполне достаточно. Что касается по очереди, то, по моему опыту, очередь может идти по одной, если вы не установите минимальный размер, что приводит к избыточному времени вlock/unlock/signal/cond_wait
. 08.04.2011