Wie erzwinge ich die Auswertung einer immer falschen Funktion?C++

Programme in C++. Entwicklerforum
Anonymous
 Wie erzwinge ich die Auswertung einer immer falschen Funktion?

Post by Anonymous »

Verfügen Sie über einen Multithread-Code, der einige Sperren durchführen muss. Auf die Details kommt es hier nicht an. Aber ich mache die kanonische do { ... } while (!CAS)-Schleife.

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()) );
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post