Der Hauptgrund für die Verwendung von Atomics über Mutexe ist, dass Mutexe teuer sind, aber das Standardspeichermodell für atomics
memory_order_seq_cst
ist, ist das nicht genauso teuer?Ist die Synchronisation mit `std :: mutex` langsamer als mit` std :: atomic (memory_order_seq_cst) `?
Frage: Kann gleichzeitig ein Programm, das Sperren verwendet, so schnell sein wie das gleichzeitige sperrfreie Programm?
Wenn ja, ist es möglicherweise nicht die Mühe wert, es sei denn, ich möchte memory_order_acq_rel
für Atomics verwenden.
Edit: ich etwas fehlt möglicherweise aber Lock-Basis kann nicht schneller sein als Lock-frei, weil jede Sperre wird auch eine vollständige Speicherbarriere sein. Aber mit Lock-Free ist es möglich, Techniken zu verwenden, die weniger restriktiv sind als Speicherbarrieren.
Also zurück zu meiner Frage, ist Lock-Free schneller als Sperre basiert in neuen C++ 11 Standard mit Standard memory_model
?
Ist "lock-free> = lock-based wenn gemessen in Leistung" wahr? Nehmen wir 2 Hardware-Threads an.
Edit 2: Meine Frage ist nicht über den Fortschritt garantiert, und vielleicht aus dem Zusammenhang gerissen "lock-free" Ich verwende.
Grundsätzlich, wenn Sie 2 Threads mit gemeinsamem Speicher haben, und die einzige Garantie, die Sie benötigen, ist, wenn ein Thread schreibt, dann kann der andere Thread nicht lesen oder schreiben, meine Annahme ist, dass eine einfache atomare compare_and_swap
Operation wäre viel schneller als das Sperren eines Mutex.
Weil, wenn ein Thread niemals den Shared Memory berührt, wirst du endlos gesperrt und entsperrt ohne Grund, aber mit atomaren Operationen benutzt du nur 1 CPU Zyklus jedes Mal.
In Bezug auf die Kommentare ist eine Spin-Lock vs Mutex-Sperre sehr unterschiedlich, wenn es sehr wenig Konkurrenz gibt.
Nun, es gibt verschiedene Fortschrittsgarantien zwischen Locks, Lock-Free und Wait-Free-Code. –
[Pflichtlektüre] (http://www.1024cores.net/home/lock-free-algorithms). –
Uhr: https://www.youtube.com/watch?v=DCdGlxBbKU4 – NoSenseEtAl