мьютексы и замки - PullRequest
       26

мьютексы и замки

6 голосов
/ 17 ноября 2009

Два примера кода ниже эквивалентны?

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 является атомарной операцией?

Ответы [ 2 ]

8 голосов
/ 17 ноября 2009

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

3 голосов
/ 17 ноября 2009

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

...