Zwei gängige Sperrwörter sind:
if (!atomic_swap(lockaddr, 1)) /* got the lock */
und:
if (!atomic_compare_and_swap(lockaddr, 0, val)) /* got the lock */
wo val
könnte einfach eine Konstante oder eine Kennung für den neuen voraussichtlichen Besitzer der Sperre sein.
Was ich gerne wissen würde, ist, ob es auf x86- (und x86_64-) Computern tendenziell einen signifikanten Leistungsunterschied zwischen den beiden gibt. Ich weiß, dass dies eine ziemlich weit gefasste Frage ist, da die Antwort zwischen den einzelnen CPU-Modellen sehr unterschiedlich sein kann, aber das ist einer der Gründe, warum ich SO frage, anstatt nur Benchmarks auf einigen CPUs durchzuführen, auf die ich Zugriff habe.
+1 nur dafür, dass Sie dem “Profilieren Sie es!” und “Denken Sie nicht einmal darüber nach, es sei denn, es handelt sich um einen nachgewiesenen Engpass!” Kommentare 🙂
– Steve Jessop
17. März 2011 um 13:42 Uhr
Um es noch schlimmer zu machen, wäre ich nicht überrascht, dass der Konflikt und die Art der verfügbaren Parallelität (ein Mehrkernprozessor oder mehrere Prozessoren) ebenfalls ein wichtiger Faktor sein können.
– Ein Programmierer
17. März 2011 um 14:04 Uhr
Wenn der Fast-Path die Sperre nicht erhält, sollte Ihre Spin-Schleife prüfen, ob sie schreibgeschützt ist, bevor Sie es erneut versuchen
xchg
odercmpxchg
, um zu vermeiden, dass alle Kellner auf die Cache-Zeile hämmern und den Thread verzögern, der versucht, ihn zu entsperren. (Verwenden_mm_pause()
undatomic_load_explicit(lockaddr, memory_order_relaxed)
im Spinloop. Vermeiden Sie es zu haben_mm_pause()
auf dem schnellen Weg). stackoverflow.com/a/37246263/224132 und stackoverflow.com/a/11980693/224132.– Peter Cordes
8. Juli 2017 um 8:20 Uhr