Es gibt zwei atomare CAS-Operationen in C++ 11: atomic_compare_exchange_weak
und atomic_compare_exchange_strong
.Wann sollte std :: atomic_compare_exchange_strong verwendet werden?
Nach cppreference:
Die schwachen Formen der Funktionen erlaubt spuriously scheitern, dass ist, handeln, als ob * obj = * erwartet, auch wenn sie gleich sind!. Wenn ein Compare-and-Exchange in einer Schleife ist, wird die schwache Version eine bessere Leistung auf einigen Plattformen liefern. Wenn ein schwaches Vergleichen und Tausch eine Schleife erfordern würde und eine starke würde nicht, ist die starke vorzuziehen.
Das Folgende ist ein Beispiel für die Verwendung der schwache Version, denke ich:
do {
expected = current.value();
desired = f(expected);
} while (!current.atomic_compare_exchange_weak(expected, desired));
Könnte jemand ein Beispiel geben, wo der Vergleichs- und Austausch nicht in einer Schleife ist, so dass die stark Version ist vorzuziehen?
Es scheint, als könnte dies auftreten, wenn die Operation nicht kritisch war. Nehmen wir an, Sie haben eine Reihe von Worker-Threads, die regelmäßig arbeiten, aber sie prüfen auch, ob in einer Warteschlange zusätzliche Arbeiten ausgeführt werden. Wenn die CAS-Operation den Eindruck erweckt, dass die Warteschlange nicht gesperrt werden kann, ist dies möglicherweise keine große Sache, da der Mitarbeiter seine normale Arbeit fortsetzen kann. –