Этот вопрос на самом деле охватывает несколько различных вопросов / моментов.
Прежде всего, мне интересно, почему одна задача иногда приводит к задержке процессора на несколько секунд.Как правило, это указывает на проблему дизайна.Но я не знаю вашу систему, и может быть, что есть разумное объяснение, поэтому я не буду идти по этой кроличьей норе.
Так что из вашего описания вы ставите в очередь указатели на сообщения, а некопии сообщений.В этом нет ничего плохого.Но вы можете столкнуться именно с проблемой, которую вы описываете.
Существует как минимум 2 решения этой проблемы.Не зная больше, я не могу сказать, что из этого могло бы быть лучше.
Первый подход заключается в передаче копии сообщения вместо указателя на него.Например, очереди сообщений VxWorks (очевидно, не очереди CMX) ставят в очередь копию сообщения.Я не знаю, поддерживает ли CMX такую модель, и я не знаю, есть ли у вас пропускная способность / память для поддержки такого подхода.Обычно я избегаю такого подхода, когда могу, но иногда он имеет место.
Второй подход, который я использую всякий раз, когда могу в такой ситуации, состоит в том, чтобы отправитель выделял буфер сообщений (обычно из моегособственные пулы msg / buffer, обычно это связанный список блоков памяти фиксированного размера - но это детали реализации - см. это описание "пулов памяти" для иллюстрации того, что яя говорю).В любом случае - после выделения отправитель заполняет данные сообщения, ставит в очередь указатель на сообщение и освобождает контроль (владение) блока памяти (т. Е. Сообщения). Получатель теперь отвечает за освобождение / возврат памяти после прочтения сообщения .
В этом вопросе могут возникнуть другие проблемы, например, что делать, если отправитель "передает "сообщение более чем одному получателю?Как приемники координируют / взаимодействуют, так что только последний читатель освобождает память (сборщик мусора)?Но, надеюсь, из того, что вы спросили, второе решение будет работать для вас.