5

为什么 boost lockfree 大小固定为 65535 个对象?

typedef boost::lockfree::queue<int, boost::lockfree::fixed_size<true>> MyQueue;
MyQueue queue(1024*100);

上面的代码抛出异常。

我在代码中发现的原因是基于数组的空闲列表仅支持 16 位地址空间。

这是什么原因?我在 64 位 linux 机器上使用它。那么为什么将寻址限制为 2**16 项?队列是否使用“short int”进行索引?原子指令是否仅适用于 16 位字长?

我应该怎么做才能拥有比这更多容量的固定大小的队列?

4

1 回答 1

3

lockfree list 的 Boost 实现必须解决ABA 问题tag一种常见的解决方法是在所考虑的数量上添加额外的位。此外,Boost 必须在 32 位架构上运行,这意味着只能以原子方式操作 32 位值。

如果我们拆分 32 位值,我们可以存储 16 位指针和 16 位标记。无符号 16 位值限制为 65535 个不同的值。

于 2013-08-19T10:42:12.477 回答