Czy dwie próbki kodu są poniżej równoważne?muteksy i blokady
Poco::ProcessHandle::PID ProcessRunner::processId() const
{
Poco::ProcessHandle::PID pid = 0;
mMutex.lock();
pid = mPID;
mMutex.unlock();
return pid;
}
,
Poco::ProcessHandle::PID ProcessRunner::processId() const
{
Poco::ScopedLock<Poco::Mutex> lock(mMutex);
return mPID;
}
- W drugiej próbce: będzie blokada wyjść z zakresu po kopia zwracana wartość została wykonana? Ma to znaczenie, jeśli zwrócono obiekt, który miał wiele instrukcji do kopiowania.
- Czy blokada jest konieczna, jeśli zamierzasz zwrócić wartość int? Czy kopiowanie int jest operacją atomową?
Jestem bardziej zaniepokojony atomowością operacji. Co dzieje się najpierw w przykładowym kodzie 2: kopia zwróconej wartości lub zniszczenie zamka? Jeśli to nie jest pierwsze, to jest to błędny kod. – StackedCrooked
O ile mi wiadomo, najpierw zwracana jest wartość "skonstruowana", a następnie wszystkie automatyczne obiekty są niszczone. – sellibitze
Właśnie zdałem sobie sprawę, że jeśli funkcja zwraca zmienną lokalną, musi ją skopiować przed zniszczeniem. Doh. – StackedCrooked