繁体   English   中英

将地址和bool存储在一个单词中,以获得无锁双链表

[英]Store an address and a bool in one word for lock-free doubly linked list

我正在阅读一些关于无锁双链表的文章。 在这些论文中,它们将地址存储到next和prev节点,并在一个单词(int)中存储一个标志。

是因为在32位架构中,所有地址都以4字节边界对齐,因此所有地址都是4的倍数?

如果我说的原因是这个代码好吗?

const int dMask = 1;
const int pMask = ~dMask;

int store(void* pPointer, bool pDel)
{
    return reinterpret_cast<int>(pPointer) | (int)pDel;
}

void load(int pData, void** pPointer, bool* pDel)
{
    *pPointer = reinterpret_cast<void*>(pData & pMask);
    *pDel = pData & dMask;
}

还有一个问题:在Android移动设备等其他平台上,上述想法是否正确?

你或多或少是正确的。 这是非常低级代码中的常见空间优化。 便携。 (通过使用intptr_t而不是int可以使它更具可移植性。)

当然,对齐仅适用于指向更复杂类型的指针; char*不一定是对齐的。 (我见过的唯一一次是在内存管理的实现中,所涉及的所有块都需要对任何类型进行充分对齐。)

最后,我不确定作者的论文是做什么的,但是你发布的代码不能在多线程环境中使用,至少在现代机器上是这样。 要确保在另一个线程中看到一个线程中的修改,您需要使用原子类型,或某种类型的fence或membar。

大多数32位体系结构中的地址不存储在4字节边界中,而是存储在1字节中。 它们以4字节(典型字长)增量从存储器中读取。 如果没有看到这个双向链表的代码,听起来他们正在对容器如何存储数据实施一些规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM