我参与了收听网络服务的任务。这将通过推送服务发送xml数据。数据必须进行一些计算,然后我们才会显示。
我计划使用队列来按服务侦听器存储数据,并通过业务逻辑代码读取数据。它是纯粹的单一生产者单一消费者队列。
由于我必须接收数据作为Web服务推送,我必须始终打开以接收数据并将其推送到队列。我想过使用boost_lockfree_spsc_queue
。因为,如果它是一个可锁定的队列,那么监听器必须等待一段时间来获取锁,而不是boost_lockfree_spsc_queue
不需要任何锁。
我要存储的数据是
struct MemoryStruct {
char *memory;
size_t size;
};
队列是
boost::lockfree::spsc_queue<MemoryStruct*> lockFreeQ{100};
在阅读了这里的表演部分后,我有点困惑。
将boost_lockfree_spcc_queue用于生产目的是否安全?或者我应该使用带锁的标准队列(C ++ 11)吗?
由于
答案 0 :(得分:2)
是。如果您希望负载不会使CPU饱和,那么您只需要支付电费。通常的方法是指数退避。 ¹
如果你对这一点一点也不确定,那么这就像过早的优化一样,你可能会使用一个锁定队列。
您可以确保您的使用模式可以轻松交换无锁实现。创建自己的阻塞pop()
函数,以便在无锁实现的情况下包装等待逻辑。
¹见例如http://kukuruku.co/hub/cpp/lock-free-data-structures-the-evolution-of-a-stack