Um den Code prägnant zu halten, möchte ich in der while-Bedingung eine Wartezeit hinzufügen.
Offensichtlich gibt die Wartezeit immer true zurück.
Im folgenden Code (Godbolt-Link)
Soweit ich das beurteilen kann, wird die Wartefunktion nicht optimiert, obwohl dies nicht der Fall ist wirkt sich auf die while-Bedingung aus.
Ist die Ausführung von wait() garantiert, wenn der CAS fehlschlägt, oder sollte ich die Funktion wait() irgendwie umschreiben, um zu verhindern, dass der Optimierer sie eliminiert?
Code: Select all
#include
#include
#include
#include
bool wait() {
using namespace std::chrono_literals;
std::this_thread::sleep_for(10ms);
return true;
}
int main() {
int* data = new(int);
std::atomic_ref atomic_data(*data);
atomic_data.store(1, std::memory_order_relaxed);
auto expected = 2;
auto fail = true;
do {
if (0 == expected ) { break; }
fail = !atomic_data.compare_exchange_weak(expected, expected + 1, std::memory_order_release, std::memory_order_relaxed);
expected = 2; //force !success, so wait must run
} while ( !(fail or wait()) );
}
Mobile version