Beim Versuch, eine threadsichere Containerklasse von Grund auf neu zu erstellen, bin ich auf das Problem der Rückgabe von Werten von Zugriffsmethoden gestoßen. Zum Beispiel unter Windows:Kritische Abschnitte und Rückgabewerte in C++
myNode getSomeData()
{
EnterCriticalSection(& myCritSec);
myNode retobj;
// fill retobj with data from structure
LeaveCriticalSection(& myCritSec);
return retobj;
}
Jetzt nehme ich an, dass diese Art von Verfahren ist durchaus nicht Thread-sicher, da, nachdem der Code gibt den kritischen Abschnitt einen anderen Thread, mitzukommen in der Lage ist und sofort retobj
vor dem ersten Thread überschreibt kehrt zurück. Also, was ist eine elegante Möglichkeit, retobj
an den Aufrufer in einer thread-sicheren Art und Weise zurückzugeben?
Aber retobj auf dem Stapel gespeichert? Wenn es nicht als 'statisch' deklariert ist, sollten Sie keine Probleme mit den überschriebenen Daten haben. –
Wenn nicht etwas Seltsames passiert, sollte 'retobj' auf dem Stack sein, und jeder Thread sollte seinen eigenen Stack haben. Race-Bedingungen dieser Art treten häufiger auf, wenn Sie mit bereits zugewiesenem Speicher arbeiten und den Zugriff sperren müssen, um eine gemeinsame Nutzung zu verhindern. – ssube
@Inface, ok guter Punkt, solange der Rückgabewert auf dem Stack gespeichert ist, bin ich gut. – ThomasMcLeod