簡體   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