2015-04-11 12 views
5

Ich möchte wissen, wie compare_and_swap in C++ 11 zu implementieren. Hier ist, was ich versucht:Wie implementiert man CAS in C++ 11

template<typename T> 
T compare_and_swap(atomic<T>& reg,T newVal) 
{ 
    bool success = false; 
    T oldVal; 
    do 
    { 
     oldVal = reg.load(); 
     success = reg.compare_exchange_weak(oldVal,newVal); 
    }while(!success); 
    return oldVal; 
} 

Gibt es einen besseren Weg, dies zu implementieren? Diese

+0

Sie sollten versuchen, in http://codereview.stackexchange.com/ – Raistmaj

+4

zu fragen compare_exchange macht bereits den Austausch, Sie brauchen Ihren Wrapper überhaupt nicht. – Mat

+0

@Mat negativ, compare_exchange würde sicherlich Codezeilen in einigen Situationen hinzufügen. Situation, die Semantik von compare_and_swap viele Male – AntiMoron

Antwort

0

ist, wie ich es tun würde:

//untested code 
template<typename T> 
T compare_and_swap(atomic<T>& reg,T newVal) 
{ 
    oldVal = atomic_load(reg); 
    while(!atomic_compare_exchange_weak(&reg, &oldVal, newVal)); 
    return oldVal; 
} 

Die Austauschfunktion vergleicht den oldval Wert aktualisieren, wenn es fehlschlägt. Daher muss dies nicht wiederholt werden.

Wie Sie sehen können, bevorzuge ich die expliziten atomaren Operationen. Dies liegt daran, dass die vollständigen nicht immer implementiert sind. Wie erklärt Herb Sutter here (der Rest des Videos könnte dich auch interessieren :)).

Als möglicherweise überflüssig nachträglich möchte ich vor der Verwendung dieser Funktion mit nicht trivially copyable Typen warnen. Oder "normale" Zeiger. Gemeinsame Zeiger sind im Allgemeinen in Ordnung :).

Verwandte Themen