Если бы у меня была эта проблема (и «опрос», т. Е. Попытка каждой очереди поочередно с короткими тайм-аутами была неприемлема - обычно это из-за расточительности процессорного времени и т. Д.), Я бы решил ее, разработав «многозадачный» объект - один с несколькими переменными условия, по одному на «очередь» и общий. Подача в любой подкатегорий будет сигнализировать как о конкретной переменной условия этого подкласса, так и об общей; get из определенного подзапроса будет ожидать только его определенной условной переменной, но также будет «get from any subqueue», который вместо этого ожидает общую условную переменную. (Если необходимо поддерживать больше комбинаций, чем «получить из этого конкретного подклада» или «получить из любого подзапада», потребуется столько же условных переменных, сколько будет необходимо поддерживать комбинации).
Было бы намного проще кодировать, если бы get
и put
были сведены к их голым костям (без тайм-аутов, без ожидания и т. Д.), И все вложенные очереди использовали один общий мьютекс (очень небольшие издержки по сравнению со многими мьютексами) и гораздо проще кодировать без тупиков ;-). Подзадачи могут быть представлены как «упрощенные подобные очереди» существующему коду, который предполагает, что он имеет дело с простой старой очередью (например, мульти-очередь может поддерживать индексирование для возврата прокси-объектов для этой цели).
С этими допущениями кода не было бы много кода, хотя было бы чрезвычайно сложно писать и проверять правильность (увы, тестирование имеет ограниченное применение, когда в игре присутствует очень тонкий многопоточный код) - я не могу потратьте время на это прямо сейчас, хотя я был бы рад попробовать сегодня вечером (через 8 часов или около того), если предположения примерно верны, и нет другого предпочтительного ответа.