下面的两个代码示例是否等效?
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;
}在第二个示例中,
发布于 2009-11-17 20:47:09
它们是等价物。在执行块的最后一行之前,局部变量不会超出范围。因此,在这种情况下,返回值副本是在锁的保护下进行的。
发布于 2009-11-17 20:45:38
如果Poco的ScopedLock可以像Boost的lock_guard那样工作,PID分配不能抛出异常,那么第一个问题的答案是肯定的。此ScopedLock的目的是防止死锁。即使在异常被抛出的情况下,也不能忘记解锁互斥锁。即使您“只读取一些数据”,也需要锁定吗?在这种情况下(只访问一个int )是一种灰色区域(最好不要这样做),但是通常,如果只读取数据,也会锁定互斥对象。
https://stackoverflow.com/questions/1751611
复制相似问题