In der Linux-Kernel-Spinlock-Implementierung für die TILE-Gx-Architektur sieht es so aus, als würden sie beim Sperren (nur beim Entsperren) keine Speicherbarrieren ausgeben:
Dann verstehe ich nicht, warum Befehle nicht über der Verriegelung neu angeordnet werden können, was dazu führen würde, dass Anweisungen, die der Programmierer für wahr hält, ausgeführt werden, bevor die Sperre ausgeführt wird?
Andere Architekturen scheinen zumindest eine Compiler-Barriere zu haben:
ARMs Spinlock hat eine Speicherbarriere:
Mit Kommentar:
%Vor%
Und der Spinlock von x86 hat eine Compiler-Barriere:
Mit Kommentar:
%Vor%
Warum ist TILE-Gx anders? Ich dachte, sein Speichermodell sei so schwach wie ARMs Speichermodell. Und warum haben sie nicht einmal eine Compiler-Barriere?
Die Sperrfunktion arch_spin_lock
verwendet arch_spin_lock_slow
, was wiederum cmpxchg
verwendet. Die Implementierung von cmpxchg
enthält eine Speicherbarrierenanweisung (siehe Ссылка ).
Tags und Links multithreading memory-barriers linux-kernel memory-model tilera