2017-08-06 3 views
0

Wie kann ich die folgenden Operationen im atomaren Betrieb ausführen? Ist das möglich?Zeiger mit nullptr atomisch austauschen

LARGE_INTEGER* ptr; // field 

void method() 
{ 
     LARGE_INTEGER* local = ptr; 
     ptr = nullptr; 
} 

Deshalb möchte ich Zeiger von Feld in lokale Zeiger speichern und sofort das Feld zu nullptr gesetzt.

Mit anderen Worten, ich möchte Zeiger von Feld in lokale Variable in einzelnen atomaren Betrieb verschieben.

+2

'LARGE_INTEGER * local = InterlockedExchangePointer (& ptr, nullptr);' Kann eine Besetzung auf dem ersten Argumente benötigen. –

+0

@IgorTandetnik kann es frei sein? –

+0

Es ist wie gezeigt frei von Sperren. –

Antwort

1

Da C++ 11 Sie std::atomic zu diesem Zweck wie folgt verwendet werden:

#include <atomic> 
LARGE_INTEGER value; 
std::atomic<LARGE_INTEGER*> ptr{&value}; 
LARGE_INTEGER* local = ptr.exchange(nullptr);