Есть ли у каких-либо "запрашивающих" потоков что-нибудь прибыльное, что они могли бы делать, ожидая ответа от базы данных? Если ответ «нет», поскольку я подозреваю, что это весьма вероятно, то, возможно, вы можете немного упростить вашу ситуацию, исключив необходимость в «потоке БД» полностью. Возможно, все потоки могут поочередно совместно использовать одно соединение с базой данных, используя объект взаимного исключения, чтобы заставить их «ждать своей очереди».
В этом сценарии было бы одно соединение с базой данных, и любой поток, который должен был использовать его, делал бы это. Но они должны были бы сначала получить объект мьютекса, удерживать его во время выполнения запросов к базе данных, а затем освободить мьютекс, чтобы следующий поток мог иметь свою очередь.
Если вы решите, что каким-то образом выгодно (или необходимо ...) выделить поток для управления соединением, то, возможно, вы могли бы достичь результата, используя (a) мьютекс для сериализации запросы, как и прежде; и (b) один объект события, чтобы сигнализировать потоку DB о том, что был отправлен новый запрос, и (c) другой объект события, чтобы сигнализировать, что запрос имеет было завершено.
В любом случае, если вы действительно определили, что потоки запрашивающей стороны не имеют ничего полезного, что они могли бы делать в то же время, у вас есть потоки, «просто спящие», пока не наступит их очередь. Затем они делают свое дело, прямо или косвенно. Здесь нет «очередей», нет сложных общих структур данных, просто потому что вы (скажем ...) определили, что в них нет необходимости.