Ответ Даниэля является его частью, но здесь есть большая проблема: boost :: interprocess в основном поддерживает очередь как массив в разделяемой памяти, а при отправке сообщения boost :: interprocess: message_queue выполняет бинарный поискна основе приоритета нового сообщения, чтобы найти, где сообщение должно быть помещено в массив, а затем std::backward_copy
s все остальные сообщения, чтобы освободить место для него.Если вы всегда используете один и тот же приоритет, ваше сообщение будет помещено в начало (поскольку оно самое новое), и поэтому любые сообщения, которые у вас есть в буфере в это время, будут обратно скопированы, чтобы освободить место для этого, что займет время.(См. Реализацию метода queue_free_msg
).
Если вам не нужны сообщения с приоритетами, а просто нужна обычная очередь FIFO, тогда этот подход намного медленнее, чем при использовании CircularБуфер : производительность вставок (отправлений) быстро ухудшается с ростом размера очереди.
ОБНОВЛЕНИЕ: Я написал версию message_queue, которая использует внутренний буфер, с помощью заметок в Википедии , и это имело большой успех.