2009-03-21 5 views
4

Ich habe gefunden lock inc addr, aber das hält nicht eine Kopie des gespeicherten Wertes herum und sogar ein Lesen unmittelbar danach in demselben Thread könnte nach einem konkurrierenden schreiben kommen.Hat x86 ein atomares Inkrement, das den Wert speichert, der gespeichert wurde?

Die beste Lösung, die ich gefunden habe, ist eine load/inc/cas Schleife.

+0

In C++ 11 std :: atomic, ['fetch_add] (http://en.cppreference.com/w/cpp/atomic/atomic/fetch_add)' + 1' tut was Sie wollen. Oder einfacher, ['operator ++'] (http://en.cppreference.com/w/cpp/atomic/atomic/operator_arith), aber dann kann man keinen schwächeren 'memory_order_relaxed' verwenden, um es schneller zu machen x86, wenn Sie keine Barriere benötigen. ('lock xadd 'implementiert' fetch_add 'und gibt den alten Wert zurück). –

+0

[Kann num ++ für 'int num' atomar sein?] (Https://stackoverflow.com/q/39393850/995714) –

Antwort

11

lock xadd ist dein Freund.