2009-11-17 9 views
6

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ą?

Odpowiedz

8

Są one równoważne. Miejscowi nie wychodzą poza zasięg, dopóki ostatni wiersz ich bloku nie zostanie wykonany. Tak więc w tym przypadku kopia wartości zwracanej jest wykonywana pod ochroną zamka.

3

Jeśli Poco's ScopedLock działa jak blokada zabezpieczająca Boost, a przypisanie PID nie może wyrzucić wyjątku, odpowiedź na pierwsze pytanie brzmi "tak". Celem tego narzędzia ScopedLock jest zapobieganie zakleszczeniom. Nie możesz zapomnieć o odblokowaniu muteksa nawet w przypadku wyjątków, które zostały odrzucone. Czy potrzebujesz blokowania, nawet jeśli "czytasz tylko niektóre dane"? Cóż, w tym przypadku (dostęp tylko do jednej int) jest to szara strefa (lepiej tego nie rób), ale na ogół blokujesz też muteks, jeśli właśnie czytasz dane.

+0

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

+0

O ile mi wiadomo, najpierw zwracana jest wartość "skonstruowana", a następnie wszystkie automatyczne obiekty są niszczone. – sellibitze

+0

Właśnie zdałem sobie sprawę, że jeśli funkcja zwraca zmienną lokalną, musi ją skopiować przed zniszczeniem. Doh. – StackedCrooked

Powiązane problemy