本文介紹了什么是C++11原子庫與Java的原子庫等價物?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
需要此調用來實現無鎖的鏈表。
ATOMICMarkableReference是一個來自java.util.concurent.atom包的對象,它封裝了對類型T的對象的引用和布爾標記。這些字段可以一起更新,也可以單獨更新。
謝謝。
推薦答案
假設對象的對齊大于1,則可以將指針的最后一位用作布爾標記:
template<class T>
class MarkableReference
{
private:
uintptr_t val;
static const uintptr_t mask = 1;
public:
MarkableReference(T* ref = NULL, bool mark = false)
{
val = ((uintptr_t)ref & ~mask) | (mark ? 1 : 0);
}
T* getRef(void)
{
return (T*)(val & ~mask);
}
bool getMark(void)
{
return (val & mask);
}
};
為了執行原子操作,您需要從這個類創建原子變量。例如,如果引用指向的對象類型應為int
,則可以創建此變量:
atomic<MarkableReference<int>> mRef;
對于變量mRef
,您可以應用任何操作,這適用于普通的原子。例如,比較并設置(CAS):
int a;
int b;
...
// Atomically change pair (&a, true) to (&b, false).
MarkableReference<int> old = mRef.load();
if(old == MarkableReference(&a, true))
{
if(mRef.compare_exchange_strong(old, MarkableReference(&b, false)))
{
// Successful CAS
}
}
// 'old' contains other value. (Unsuccessfull CAS)
這篇關于什么是C++11原子庫與Java的原子庫等價物?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,