本文介紹了什么是C++11原子庫(kù)與Java的原子庫(kù)等價(jià)物?的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
需要此調(diào)用來(lái)實(shí)現(xiàn)無(wú)鎖的鏈表。
ATOMICMarkableReference是一個(gè)來(lái)自java.util.concurent.atom包的對(duì)象,它封裝了對(duì)類(lèi)型T的對(duì)象的引用和布爾標(biāo)記。這些字段可以一起更新,也可以單獨(dú)更新。
謝謝。
推薦答案
假設(shè)對(duì)象的對(duì)齊大于1,則可以將指針的最后一位用作布爾標(biāo)記:
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);
}
};
為了執(zhí)行原子操作,您需要從這個(gè)類(lèi)創(chuàng)建原子變量。例如,如果引用指向的對(duì)象類(lèi)型應(yīng)為int
,則可以創(chuàng)建此變量:
atomic<MarkableReference<int>> mRef;
對(duì)于變量mRef
,您可以應(yīng)用任何操作,這適用于普通的原子。例如,比較并設(shè)置(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)
這篇關(guān)于什么是C++11原子庫(kù)與Java的原子庫(kù)等價(jià)物?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,