boost fetch_add
-
Hallo,
ich würde gerne aus boost::atomic fetch_add oder fetch_sub benutzen.
Allerdings klappt das nicht, mein compiler schreit mit fecht_add is not a valid member of boost::atomics::atomic<T>ich dachte ganz trivial das so zu benutzen:
boost::atomic<bool> myAtomicBool; myAtomicBool.fetch_add( /*hier stehen die parameter*/ );warum klappt das nicht? Wie kann ich fetch_add nutzen?
Danke
-
Vielleicht machst du was falsch.
-
Danke. Darauf wäre ich nicht gekommen.
Anbei ein Minimalbeispiel - vielleicht bekomme ich dann Hilfe...
#include <iostream> #include <boost/atomic.hpp> int main() { boost::atomic<bool> myAtomicBool(false); myAtomicBool.fetch_add(true, boost::memory_order_seq_cst); std::cout << "Finished test" << std::endl; return 0; }
-
Die Memberfunktion
fetch_addgibt es nur für Integer Types, aber nicht fürbool. Also entwederboost::atomic<int>verwenden wenn wirklich Addition gefragt ist oder eine der exchange Funktionen nutzen.
-
Danke. MVerstehe ich Dich richtig dass für bool ein exchange atomar und gleichbedeutend mit einem fetch_add für integrale typen ist?
-
Naja exchange, also austauschen, ist was grundlegend anderes als eine Addition. In normalem Code würdest du ja auch kein
bool flag = ...; flag += true;schreiben. Sondern eher etwas wie:
flag = true; // Oder auch: if(flag == false) flag = true;Ersteres wäre ein "exchange", der Wert wird ersetzt, egal wie der Wert vorher war. Das zweite ist ein "compare exchange", der Wert wird nur dann ersetzt wenn er bereits einen bestimmten Wert hat. Dafür gibt es in boost auch die Funktionen
compare_exchange_weakundcompare_exchange_strong.
-
Korrektur: Eigentlich ist das erste Beispiel gar kein exchange sondern einfach ein store. Bei einem exchange kriegt man noch als zusätzliche Info was der vorherige Wert war. Atomar sind aber alle diese Operationen.
-
Danke weiterhin. Ich hätte eine Folgefrage:
Ist denn der Operator "!" atomar? Also ist folgendes gänzlich atomar?boost::atomic<bool> myAtomicBool(false); if (!myAtomicBool.load()) //...myAtomicBool.load() ist atomar wie ich vermute. Aber ist die Negation auch Atomar in Kombination?
-
Nein es ist nicht atomar, ist aber auch gar nicht notwendig. Der Wert aus deinem atomic bool wird genau einmal gelesen und damit dein Vergleich angestellt. Ob sich der tatsächliche Wert in der Zwischenzeit geändert hat sollte keine Rolle spielen.