Ich habe vor kurzem gelernt, dass Compiler Ihren Code durch Umordnen von Anweisungen optimieren, und dass dies durch Barrieren gesteuert werden kann.Benötige ich einen Zaun oder eine Schranke oder etwas, wenn Mutex Locks/Unlocks tief in Funktionsaufrufen vergraben sind?
IIRC, macht einen Mutex Verriegeln eine Sperre, und ein Mutex Entriegeln macht auch eine Barriere, Code innerhalb des kritischen Abschnitts zu verhindern, immer aus.
So pthread_mutex_lock und pthread_mutex_unlock muss implizit diese "Hindernisse" sein. Was, wenn ich eine Klasse wie diese habe, die meinen Mutex umschließt?
class IMutex {
public:
virtual void lock() = 0;
virtual void unlock() = 0;
};
scheint es mir, weiß der Compiler nicht, dass ich rufe pthread_mutex_lock() innerhalb lock() und pthread_mutex_unlock() innerhalb unlock(), weil es weg alle virtual'd ist.
Führt dies zu Fehlern? Muss ich Barrieren irgendwie manuell festlegen?
Ich denke, ein Funktionsaufruf wäre eine Barriere für den Compiler Moving Code. Wir verwenden Mutex's und fügen keine Barrieren hinzu. Es gibt Speicherbarrieren, die eine andere Sache sind. –
oh, das macht Sinn. Vielen Dank! – Verdagon
Ja, kein vernünftiger Compiler wird um einen virtuellen Funktionsaufruf herumordnen ... –