Sie haben nicht erwähnt, was der Typ der mutex
Variable ist, aber unter der Annahme, dass es eine std::mutex
(oder etwas ähnliches, um gegenseitigen Ausschluss zu gewährleisten) ist, wird der Compiler verhindert, eine Vielzahl von Optimierungen durchzuführen. Sie müssen sich also keine Gedanken über die Rückgabewertoptimierung oder eine andere Optimierung machen, die es ermöglicht, dass die size()
Abfrage außerhalb des Mutexblocks ausgeführt wird.
Sobald jedoch die Mutex-Sperre aufgehoben wird, kann ein anderer wartender Thread auf den Vektor zugreifen und ihn möglicherweise mutieren, wodurch die Größe geändert wird. Nun ist die von Ihrer Funktion zurückgegebene Nummer veraltet. Wie Mats Petersson in seinem answer erwähnt, wenn das ein Problem ist, muss die Mutexsperre von dem Aufrufer von getNumber()
erfasst werden, und gehalten werden, bis der Aufrufer das Ergebnis verwendet. Dadurch wird sichergestellt, dass sich die Größe des Vektors während der Operation nicht ändert.
expliziter Aufruf mutex::lock
gefolgt von mutex::unlock
wird schnell undurchführbar für kompliziertere Funktionen die Ausnahmen, mehr return-Anweisungen usw. Eine wesentlich einfachere Alternative ist std::lock_guard
zu verwenden, um die Mutex-Sperre zu erwerben.
int getNumber()
{
std::lock_guard<std::mutex> l(mutex); // lock is acquired
int size = someVector.size();
return size;
} // lock is released automatically when l goes out of scope
Es gibt eine Erklärung der volatilen hier: http://StackOverflow.com/Questions/154551/volatile-vs-interlocked-vs-lock – Will
@Will ich glaube nicht, dass die C# 'volatile' ist das gleiche wie die C++' volatile' (obwohl es in beiden Sprachen in dieser Situation nutzlos wäre). –
Hoppla, ich habe nicht gesehen, dass diese Antwort für C++ war. Hier ist eine bessere Erklärung der volatilen: http://StackOverflow.com/Questions/72552/Why-does-Volatile-Exist – Will