具有锁定与锁定免费队列的队列

时间:2016-12-06 13:04:38

标签: multithreading c++11 boost producer-consumer lock-free

我参与了收听网络服务的任务。这将通过推送服务发送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)吗?

由于

1 个答案:

答案 0 :(得分:2)

是。如果您希望负载不会使CPU饱和,那么您只需要支付电费。通常的方法是指数退避。 ¹

如果你对这一点一点也不确定,那么这就像过早的优化一样,你可能会使用一个锁定队列。

您可以确保您的使用模式可以轻松交换无锁实现。创建自己的阻塞pop()函数,以便在无锁实现的情况下包装等待逻辑。

¹见例如http://kukuruku.co/hub/cpp/lock-free-data-structures-the-evolution-of-a-stack