为什么boost lockfree大小固定为65535个对象?
typedef boost::lockfree::queue<int, boost::lockfree::fixed_size<true>> MyQueue;
MyQueue queue(1024*100);
以上代码抛出异常。
我在代码中发现的原因是基于数组的freelists只支持16位地址空间。
这是什么原因?我在64位linux机器上使用它。那么为什么要将寻址限制在2 ** 16项?队列是否使用'short int'进行索引?原子指令只适用于16位字长吗?
我该怎么做才能拥有一个比这更大容量的固定大小的队列?
答案 0 :(得分:3)
提升锁定列表的实施必须与ABA problem作斗争。常见的解决方法是在正在考虑的数量上添加额外的tag
位。此外,Boost必须运行在32位架构上,这意味着只能以原子方式操作32位值。
如果我们分割32位值,我们可以存储16位指针和16位标记。无符号16位值限制为65535个不同的值。