- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
Boost documentation for spsc_queue
说:
read_available()
:线程安全且无需等待,只能从生产者线程调用
write_available()
:线程安全且无需等待,只能从消费者线程调用
我希望最常见的用例正好相反:生产者线程(线程写入数据到队列)需要write_available()
,并且消费者线程(线程读取队列中的数据)需要read_available()
。
如果我需要知道我可以在生产者线程中写入多少队列,我应该使用 QUEUE_CAPACITY - read_available()
吗?
最佳答案
任何类型的大小评估都将成为无锁世界中的一场竞赛。
原因很简单,在您对“测量大小”采取行动之前,其他线程上的大小可能会发生变化。
Single-Producer/Single-Consumer 是特殊,因为消费者知道没有其他人可以从队列中读取(所以“read_available”永远不会减少< em>除非消费者自己阅读)。生产者方面也是如此。
显然 write_available
是您所需要的。当然,到您实际写作时,它可能更多,但您无法获得更准确的信息。至少它永远不会less(毕竟只有 1 个生产者线程)。
Note that the documentation appears to be in error (swapping the allowed threads)
This made me double check, and sure enough they use the functions internally in the expected ways (contradicting the erronous documentation claim):
ConstIterator push(ConstIterator begin, ConstIterator end, T * internal_buffer, size_t max_size)
{
const size_t write_index = write_index_.load(memory_order_relaxed); // only written from push thread
const size_t read_index = read_index_.load(memory_order_acquire);
const size_t avail = write_available(write_index, read_index, max_size);
我衷心建议使用此处显示的范围推送来自动推送可能的确切项目数。例如:
auto b = messages.begin(), e = messages.end();
do {
b = a.push(b, e)
} while (b != e);
关于c++ - boost::lockfree::spsc_queue的read_available和write_available应该如何使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30696326/
我是一名优秀的程序员,十分优秀!