Как упорядочены сообщения внутри очереди IPC

Мне нужно знать, если эти сообщения в очереди IPC заказаны. На практике мне нужно знать, если при вызове функции msgrvc я получаю первое сообщение, поступившее в очередь, или выбранное сообщение является случайным.

Теперь я задаю этот вопрос, потому что, находясь внутри части кода msgrcv, получаю сообщение, которое не предназначено для этого кода, я обычно запрашиваю сообщение, читая следующее сообщение в очереди. Что мне интересно, так это то, что, например, он следит за сообщениями

msgA, msgB, msgC

, хранится в очереди. Если прочитать msgA и запросить его, я получу очередь с сообщениями в новом порядке.

msgB, msgC, msgA

и поэтому следующий вызов msgrcv даст мне msgB или, если этот порядок случайный, и я смогу снова прочитать msgA

Спасибо энзо

3 ответа

Очередь сообщений в общем случае работает как первый в буфере, но есть способы изменить это.

  • Если вы вызовете msgrcv() с нулевым msgtyp, вы получите первое сообщение в очереди.
  • Если вы вызываете его с msgtyp, установленным в> 0, очередь будет возвращать только сообщения с типами, соответствующими номеру, указанному в msgtyp, и это подмножество будет доставляться по принципу "первым пришел - первым вышел".
  • Если вы вызываете его с msgtyp, установленным на < 0, первое сообщение с типом, установленным равным или меньшим, чем абсолютное значение msgtyp, будет возвращено, но снова оно будет первым вошел первым.

Хороший пример этого есть в программном интерфейсе Linux, см. Раздел 46.2.2.

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

Рассматривали ли вы использование подхода типа Token Ring с несколькими настроенными очередями сообщений? Т.е. первая очередь получена вашим потоком, и если сообщение было прочитано, но не представляет интереса, оно помещается во вторую очередь для использования следующим потоком; это будет продолжаться до тех пор, пока все потоки не прочитают постепенно сокращающийся набор сообщений.

Очередь сообщений IPC, как следует из ее названия, является очередью, поэтому повторная очередь будет работать.

Я сомневаюсь, что это будет быстрее, чем выбор типа, хотя, msgrcv просто нужно проверить тип каждого сообщения в очереди, пока он не найдет первое сообщение с этим типом. Ваш код удаляет сообщение, проверяет его тип и ставит его в очередь.

Похоже, вы хотите выбрать, что читать из очереди сообщений IPC. Вместо того, чтобы ставить в очередь, вы можете использовать аргумент типа сообщения msgrcv и msgsnd.

Другие вопросы по тегам