C++ boost::lockfree::spsc#u queue';可以使用“读”和“写”吗?

C++ boost::lockfree::spsc#u queue';可以使用“读”和“写”吗?,c++,boost,lock-free,C++,Boost,Lock Free,说: read\u available():线程安全和无等待,应仅从生产者线程调用 write\u available():线程安全和无等待,应仅从使用者线程调用 我希望最常见的用例正好相反:生产者线程(将数据写入队列的线程)需要write\u available(),消费者线程(从队列读取数据的线程)需要read\u available() 如果我需要知道我可以在producer线程中向队列写入多少,我是否应该使用队列容量-read\u available()?任何类型的大小评估都将是无锁世界

说:

read\u available()
:线程安全和无等待,应仅从生产者线程调用

write\u available()
:线程安全和无等待,应仅从使用者线程调用

我希望最常见的用例正好相反:生产者线程(将数据写入队列的线程)需要
write\u available()
,消费者线程(从队列读取数据的线程)需要
read\u available()


如果我需要知道我可以在producer线程中向队列写入多少,我是否应该使用
队列容量-read\u available()

任何类型的大小评估都将是无锁世界中的一场竞赛

原因很简单,在对“测量的大小”进行操作之前,其他线程上的大小可能会更改

单个生产者/单个消费者是特殊的,因为消费者知道没有其他人可以从队列中读取数据(因此“read_available”永远不会减少,除非消费者自己读取数据)。生产者方面也是如此

很明显,
write\u available
是您所需要的。当然,当你实际写作时,它可能会更准确,但你无法得到更准确的答案。至少它永远不会少(毕竟只有一个生产者线程)

注意文档似乎有错误(交换允许的线程)

这让我仔细检查了一遍,并且确信他们以预期的方式在内部使用了这些函数(与错误的文档声明相矛盾):

我衷心建议使用此处显示的范围推送来自动推送可能的确切项目数。例如:

auto b = messages.begin(), e = messages.end();
do {
    b = a.push(b, e)
} while (b != e);

任何尺寸评估都将是无锁世界中的一场竞赛

原因很简单,在对“测量的大小”进行操作之前,其他线程上的大小可能会更改

单个生产者/单个消费者是特殊的,因为消费者知道没有其他人可以从队列中读取数据(因此“read_available”永远不会减少,除非消费者自己读取数据)。生产者方面也是如此

很明显,
write\u available
是您所需要的。当然,当你实际写作时,它可能会更准确,但你无法得到更准确的答案。至少它永远不会少(毕竟只有一个生产者线程)

注意文档似乎有错误(交换允许的线程)

这让我仔细检查了一遍,并且确信他们以预期的方式在内部使用了这些函数(与错误的文档声明相矛盾):

我衷心建议使用此处显示的范围推送来自动推送可能的确切项目数。例如:

auto b = messages.begin(), e = messages.end();
do {
    b = a.push(b, e)
} while (b != e);

谢谢,这更有意义。开发分支中的文档似乎已经修复:@khuttun谢谢!这是确凿的证据。(让你想知道…哦)谢谢,这更有意义。开发分支中的文档似乎已经修复:@khuttun谢谢!这是确凿的证据。(让你想知道…哦)谢谢,这更有意义。开发分支中的文档似乎已经修复:@khuttun谢谢!这是确凿的证据。(让你想知道……哦)