Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost如何在32位机器上避免ABA问题?_C++_Boost_Lock Free - Fatal编程技术网

C++ boost如何在32位机器上避免ABA问题?

C++ boost如何在32位机器上避免ABA问题?,c++,boost,lock-free,C++,Boost,Lock Free,我正在阅读boost文档的一部分,它说“使用固定大小的数组存储内部节点”,以避免在32位机器上出现ABA问题。有人能告诉我这部分在源代码中的位置吗?整个boost项目对我来说太大了,谢谢。我没有指向源代码的指针,但文档对我来说似乎足够清晰 当队列的大小事先已知时,他们可以使用带标记的索引,而不是使用带标记的指针。这样,它们不需要指针的整个宽度(因为理论上可以在32位虚拟地址空间中的任何位置分配节点),而只需要足够的位将索引值(基于0)分配到预先分配的节点数组中 因此,假设您想要一个最多包含655

我正在阅读boost文档的一部分,它说“使用固定大小的数组存储内部节点”,以避免在32位机器上出现ABA问题。有人能告诉我这部分在源代码中的位置吗?整个boost项目对我来说太大了,谢谢。

我没有指向源代码的指针,但文档对我来说似乎足够清晰

当队列的大小事先已知时,他们可以使用带标记的索引,而不是使用带标记的指针。这样,它们不需要指针的整个宽度(因为理论上可以在32位虚拟地址空间中的任何位置分配节点),而只需要足够的位将索引值(基于0)分配到预先分配的节点数组中

因此,假设您想要一个最多包含65536个元素的队列:使用指针,您需要32位(或者如果您可以依赖以某种方式对齐的分配,则需要更少的位)来寻址元素,然后需要更多的位来寻址标记,这完全不适合单个32位字。但是使用索引,您只需要16位来寻址(嗯,索引)0到65535之间的所有值。32位宽机器字的其余部分可用于存储标记值,并且在硬件级别只需要32位宽的CAS指令