spsc_queue说:
read_available():线程安全和无等待,只应从生产者线程调用。
write_available():线程安全和无等待,只应从使用者线程调用。
我认为最常见的用例正好相反:生产者线程(向队列写入数据的线程)需要write_available(),而使用者线程(从队列读取数据)需要read_available()。
如果我需要知道我能写多少到生产者线程中的队列,我应该使用QUEUE_CAPACITY - read_available()吗?
发布于 2015-06-08 10:29:31
任何一种大小评估都将是无锁世界中的一场比赛。
简单的原因是,在对“测量的大小”进行操作之前,其他线程的大小可能会更改。
单生产者/单一消费者在某种意义上是特殊的,因为消费者知道没有其他人可以从队列中读取(因此,除非消费者自己读取,否则"read_available“不会减少)。制片人方面也是如此。
显然,write_available 是您需要的。当然,在你实际写作的时候,它可能会更多,但你无法得到更准确的答案。至少它永远不会少(毕竟只有一个生产者线程)。
备注文档似乎有错误(交换允许的线程) 这使我不得不再次检查,而且足够肯定的是,它们以预期的方式在内部使用函数(与错误的文档声明相矛盾): ConstIterator push(ConstIterator avail,ConstIterator end,T* internal_buffer,size_t max_size) { const size_t write_index = write_index_.load(memory_order_relaxed);//只写自push线程const size_t read_index = read_index_.load(memory_order_acquire);
我衷心建议使用范围推送这里显示的自动推送准确的项目数可能。例如:
auto b = messages.begin(), e = messages.end();
do {
b = a.push(b, e)
} while (b != e);https://stackoverflow.com/questions/30696326
复制相似问题