Ho la seguente funzione membro:Quando è il costruttore di copia per il valore di ritorno avviene
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
return m_person;
}
RAIIMutex
è una classe helper che riceve un mutex e lo blocca nel costruttore e rilascia nel distruttore.
m_person
è di tipo Person
(qualcosa di dimensioni molto piccole). Altre funzioni in altri thread potrebbero cambiare questo membro.
voglio tornare m_person
per valore (restituire una copia) e, naturalmente, voglio evitare la situazione in cui l'm_person
essere cambiato in un altro thread mentre viene copiato nel ritorno così ho aggiunto la serratura.
Ma cosa succede prima? Il compilatore crea prima una copia di m_person
o prima chiama il distruttore di myLock
?
Teoricamente facilmente risolvibile facendo qualcosa di simile a questo:
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
Person tmp = m_person;
return tmp;
}
Ma io sono interessato a conoscere la risposta alla mia domanda.
Grazie
[OT] È possibile sostituire 'RAIIMutex' con [' std :: lock_gurad'] (http://en.cppreference.com/w/cpp/thread/lock_guard) – NathanOliver
il costruttore di copia non può essere chiamato a tutti, a causa di [copia elision] (https://en.wikipedia.org/wiki/Copy_elision). –
@JoachimPileborg È dubbio che "m_person' sembra essere una variabile membro della classe. – NathanOliver