Ein Mutex muss per Definition eine Speicherbarriere ausführen. Wenn ein Mutex keine Speicherbarriere enthielt, konnten Operationen an den Daten, für die er exklusiven Zugriff gewährte, außerhalb der kritischen Region neu angeordnet werden.
Unabhängig davon müssen Mutex-Implementierungen im Allgemeinen eine Speicherbarriere selbst ausführen, sonst könnte der Mutex selbst neu geordnet werden. Mit anderen Worten, die Implementierung eines Mutex beinhaltet eine Speicherbarriere, um die atomare Verriegelung durchzuführen, die notwendig ist, um den gegenseitigen Ausschluss zu erzwingen, aber selbst wenn es nicht notwendig wäre, würde ein Mutex eine Speicherbarriere enthalten, sonst würde es keine t sehr nützlich sein.
Fazit: Wenn Sie nicht möchten, dass Ihr Code bricht, verwenden Sie überall Sperren, auch wenn Speicherbarrieren erforderlich sind.
inline void mb_()
{
mutex_t mtx;
mutex_init(&mtx);
mutex_lock(&mtx);
mutex_unlock(&mtx);
}
Wenn Sie nach Leistung streben, benötigen Sie möglicherweise fortgeschrittene Techniken.
Sie kennen bereits die Antwort, wenn eine Speicherbarriere immer besser wäre, dann gäbe es keinen Punkt in einem Sperrgrundelement. Google "Livelock and Hungern", um mehr zu erfahren. –
@Hans Passant Erforderlich, um die Szenarien zu kennen, in denen die Verwendung von Speicherbarrieren unterstützt wird. Kannst du etwas Licht darauf werfen? – adisticated
Ja @Hans, Sperren können nicht in jedem Fall vermieden werden. Und darum hat adisticated die Frage von Anfang an gestellt. Ich denke, er möchte wissen, in welchen Situationen unnötige Sperren vermieden werden können. – v78