Использование очередей сообщений POSIX для внутрипроцессного взаимодействия - PullRequest
3 голосов
/ 27 февраля 2020

Я разрабатываю однопроцессное многопоточное встроенное приложение Linux. Конструкция включает в себя подсистему клиент-сервер, в которой рабочий поток получает сообщения, отправленные другими потоками в очереди сообщений POSIX.

Мне нужна очередь, чтобы демонстрировать неблокирующую семантику отправки и блокирующего приема. Я могу придумать несколько способов для достижения вышеизложенного: - Создание двух отдельных описаний очереди сообщений для доступа к очереди для отправки и получения, при котором дважды вызывается mq_open. За этим последует установка флага O_NONBLOCK описания, которое будет использоваться для отправки через очередь.

  • Указание поведения блокировки и использование mq_timedsend вместо mq_send

  • Указание поведения блокировки и вызов mq_getattr перед mq_send, чтобы избежать блокировки при отправке

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

Кажется, POSIX предоставляет такую ​​гарантию (https://pubs.opengroup.org/onlinepubs/009695399/functions/mq_open.html) однако в документации Linux прямо не говорится, что каждый вызов mq_open создает новый объект описания очереди сообщений.

Существует ли такая гарантия для Linux?

Спасибо,

1 Ответ

3 голосов
/ 27 февраля 2020

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

Вы можете использовать mq_timedsend в очереди блокировки с истекшим временем ожидания (например, abs_timeout{0, 0}), что делает вызов немедленно возвращаемым (не блокированным), когда очередь заполнена.


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

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

Мне нужна очередь для демонстрации неблокирующей семантики отправки и блокирующего приема.

Неблокирующая mq_send только означает, что она не блокируется, когда очередь заполнена.

Ядро внутренне защищает очередь сообщений с помощью спин-блокировки и эта спин-блокировка блокируется на mq_send и mq_receive, так что с точки зрения параллельной структуры данных очередь сообщений POSIX является блокирующей структурой данных.

...