这两个代码示例是否等效?
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;
}
答案 0 :(得分:8)
它们是等价的。在执行块的最后一行之后,本地不会超出范围。因此,在这种情况下,返回值复制是在锁的保护下进行的。
答案 1 :(得分:3)
如果Poco的ScopedLock像Boost的lock_guard一样工作,并且PID赋值不能抛出异常,那么第一个问题的答案是肯定的。这个ScopedLock的目的是防止死锁。即使异常被抛出,您也不会忘记解锁互斥锁。即使你“只阅读一些数据”,你还需要锁定吗?好吧,在这种情况下(仅访问一个int)是一种灰色区域(最好不要这样做),但一般来说,如果你只是读取数据,你也会锁定互斥锁。