首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应该如何促进::无锁::spsc_queue的read_available和write_available的使用?

应该如何促进::无锁::spsc_queue的read_available和write_available的使用?
EN

Stack Overflow用户
提问于 2015-06-07 17:17:44
回答 1查看 881关注 0票数 1

spsc_queue说:

read_available():线程安全和无等待,只应从生产者线程调用。

write_available():线程安全和无等待,只应从使用者线程调用。

我认为最常见的用例正好相反:生产者线程(向队列写入数据的线程)需要write_available(),而使用者线程(从队列读取数据)需要read_available()

如果我需要知道我能写多少到生产者线程中的队列,我应该使用QUEUE_CAPACITY - read_available()吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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);

我衷心建议使用范围推送这里显示的自动推送准确的项目数可能。例如:

代码语言:javascript
复制
auto b = messages.begin(), e = messages.end();
do {
    b = a.push(b, e)
} while (b != e);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30696326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档