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 的复制是原子操作?
4

2 回答 2

8

它们是等价的。直到执行完他们的块的最后一行之后,本地人才会超出范围。所以在这种情况下,返回值副本是在锁的保护下进行的。

于 2009-11-17T20:47:09.780 回答
3

如果 Poco 的 ScopedLock 像 Boost 的 lock_guard 一样工作并且 PID 分配不能抛出异常,那么第一个问题的答案是肯定的。此 ScopedLock 的目的是防止死锁。即使抛出异常,您也不能忘记解锁互斥锁。即使您“只读取一些数据”,您是否需要锁定?好吧,在这种情况下(仅访问一个 int)是一种灰色区域(最好不要这样做),但通常如果您只是读取数据,您也会锁定互斥锁。

于 2009-11-17T20:45:38.817 回答