2009-11-17 3 views
6

Являются ли два примера кода эквивалентными?мьютексы и замки

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; 
} 
  • Во втором примере: будет блокировка выходить за рамки после того, как копия возвращаемого значения была сделана? Это имеет значение, если объект был возвращен, у которого было много инструкций по копированию.
  • Является ли блокировка необходимой, если вы только собираетесь вернуть значение int? Или это копирование int атомной операции?

ответ

8

Они эквивалентны. Местные жители не выходят за пределы области действия до тех пор, пока не будет выполнена последняя строка их блока. Поэтому в этом случае копия возвращаемого значения производится под защитой блокировки.

3

Если Poco's ScopedLock работает как блокировка блокировки Boost, а назначение PID не может генерировать исключение, ответ на первый вопрос - да. Цель этого ScopedLock - предотвращать взаимоблокировки. Вы не можете забыть разблокировать мьютексы даже в случае исключения исключений. Вам нужна блокировка, даже если вы «только читаете некоторые данные»? Ну, в этом случае (доступ только к одному int) является серой зоной (лучше не делайте этого), но в целом вы также блокируете мьютекс, если вы просто читаете данные.

+0

Меня больше беспокоит атомарность операций. Что происходит сначала в примере кода 2: копия возвращаемого значения или уничтожение блокировки? Если это не первый, то это багги код. – StackedCrooked

+0

Насколько я могу судить, сначала возвращаемое значение «строится», тогда все автоматические объекты разрушаются. – sellibitze

+0

Я просто понял, что если функция возвращает локальную переменную, она должна скопировать ее, прежде чем уничтожить ее. Doh. – StackedCrooked

Смежные вопросы