我正在阅读boost文档的lock free部分,它说“使用固定大小的数组存储内部节点”以避免在32位计算机上发生ABA问题。有人可以提示我该部分在源代码中的位置吗?整个提升项目对我来说太大了,谢谢。
最佳答案
我没有指向源的指针,但是文档对我来说似乎很清楚。
当事先知道队列的大小时,他们可以使用带有标签的索引,而不是使用带有标签的指针。这样,它们不需要指针的整个宽度(因为理论上可以在32位虚拟地址空间中的任何地方分配节点),它们只需要足够的位用于数组中的索引值(从0开始)。预先分配的节点数。
因此,假设您要使队列中最多包含65536个元素:使用指针,您需要32位(如果可以依靠某种方式对齐分配,则需要一些32位)来寻址该元素,然后再增加一些标签,但完全不适合单个32位字。但是使用索引,您只需要16位就可以寻址(正确,索引)从0到65535的所有值。其余32位宽的机器字可用于存储标签值,而只有32位宽在硬件级别需要CAS指令。
关于c++ - boost如何避免32位计算机上的ABA问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25871742/