Вы пытаетесь сделать это с помощью одной блокировки, нескольких блокировок? Mutexs? Какую семантику ожидания вы используете?
Я бы догадался из вашего описания (и это всего лишь предположение), что у вас есть что-то похожее на:
lock(theLock) {
// ... do lots of work ...
}
В вашем основном потоке, который содержит код для отправки в легкие потоки. Одна из причин, по которой вы можете увидеть сокращенное время ожидания, заключается в том, что вам необходимо получить сигналы от запущенных потоков о том, что они были поставлены в очередь и ожидают выполнения (опять же, это предположение, поскольку вы не давали никакого кода).
Один из способов решить эту проблему - перейти от использования явной блокировки, как указано выше, к использованию сигнального мьютекса, который пульсирует, когда вы хотите, чтобы один из потоков перехватил работу.
Хотя, не видя вашей текущей реализации, я не уверен, что смогу сделать намного больше.