1

Wann können Sperren durch die Verwendung von Speicherbarrieren vermieden werden? Wie in diesem Fall: Consumer-Producer-Wiki (Die letzte Implementierung verwendet Speicherbarriere und Ruhe alle verwenden Sperren oder Semaphoren.)Sperrt VS-Speicherbarrieren

Ist es besser, Speichersperre in solchen Fällen als Sperren zu verwenden? Wenn ja, warum?

Was sind die häufigsten Situationen, in denen Sperren mithilfe von Speicherbarrieren vermieden werden können?

+0

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. –

+0

@Hans Passant Erforderlich, um die Szenarien zu kennen, in denen die Verwendung von Speicherbarrieren unterstützt wird. Kannst du etwas Licht darauf werfen? – adisticated

+0

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

Antwort

0

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.

+0

Wäre Sperren von ein wenig mehr Overhead sein als bloße Verwendung von Speicherbarrieren? – adisticated

+0

Der Mutex ruft intern die Anweisung mem_fence auf, und diese Art von Codeblock hat einen sehr geringen Overhead. Es besteht eine geringe Chance, dass einer der Threads auf Sperren wartet. – v78