我们正在更换消息队列的内部实现(由于整体设计的限制),并且我希望使用boost::interprocess::message_queue
作为近乎替代品。< / p>
但是,我们有一个特定的要求,即在消息队列是&#34; full&#34; (消费应用程序要么断开连接要么落后),那就是最老的&#34;消息被丢弃。
我们可以像这样轻松完成:
do
{
if(sent = message_queue.try_send(...))
{
break;
}
else
{
message_queue.receive(...);
}
}
while(true);
但是,我无法在证明这是安全的文件中找到参考。它显然不是传统的消息队列使用(从多个应用程序中使用它),但它是否可以保证工作?
答案 0 :(得分:2)
安全。 doc的相关部分是:
线程可以将消息放入队列中,也可以删除 来自队列的消息。
您还可以查看完整位于标头boost/interprocess/ipc/message_queue.hpp
中的实现,特别是私有成员函数do_receive()
。如果忽略所有共享内存机制,它只是一个使用互斥锁保护的循环缓冲区(从Boost 1.52开始)。