Как получить предмет из набора очередей? - PullRequest
0 голосов
/ 09 марта 2010

Скажем, есть два пустых Queue с. Есть ли способ получить элемент из очереди, который его получает первым?

Итак, у меня есть очередь с высокими анонимными прокси, очереди с анонимными и прозрачными. Некоторые темы могут нуждаться только в высокой скорости. прокси, в то время как другие могут принять оба высоких анона. и просто скоро. прокси. Вот почему я не могу поместить их всех в одну очередь.

Ответы [ 2 ]

0 голосов
/ 09 марта 2010

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

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

С этими допущениями кода не было бы много кода, хотя было бы чрезвычайно сложно писать и проверять правильность (увы, тестирование имеет ограниченное применение, когда в игре присутствует очень тонкий многопоточный код) - я не могу потратьте время на это прямо сейчас, хотя я был бы рад попробовать сегодня вечером (через 8 часов или около того), если предположения примерно верны, и нет другого предпочтительного ответа.

0 голосов
/ 09 марта 2010

Вы можете проверять обе очереди по очереди, каждый раз используя короткий тайм-аут. Таким образом, вы, скорее всего, будете читать из первой очереди, которая получает данные. Тем не менее, это решение подвержено условиям гонки, если вы будете получать много предметов на регулярной основе.

Если это так, у вас есть веская причина не просто записывать данные в одну очередь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...