Nel tentativo di creare una classe contenitore sicura da thread da zero, ho riscontrato il problema della restituzione dei valori dai metodi di accesso. Per esempio in Windows:Sezioni critiche e valori restituiti in C++
myNode getSomeData()
{
EnterCriticalSection(& myCritSec);
myNode retobj;
// fill retobj with data from structure
LeaveCriticalSection(& myCritSec);
return retobj;
}
Ora suppongo che questo tipo di metodo non è affatto thread-safe perché dopo il codice rilascia la sezione critica un altro thread è in grado di venire avanti e subito sovrascrivere retobj
prima del primo filo ritorna. Quindi, qual è un modo elegante per restituire retobj
al chiamante in modalità thread-safe?
Ma retobj viene memorizzato nello stack? A meno che non sia dichiarato 'statico' non dovresti avere problemi con la sovrascrittura dei dati copiati. –
A meno che qualcosa di strano stia accadendo, 'retobj' dovrebbe essere in pila, e ogni thread dovrebbe avere il proprio stack. Le condizioni di gara di questo tipo sono più comuni quando si lavora con memoria pre-allocata e si deve bloccare l'accesso per impedire la condivisione. – ssube
@inface, ok buon punto, quindi fintanto che il valore di ritorno è memorizzato nello stack, sto bene. – ThomasMcLeod