互斥锁和锁

时间:2009-11-17 20:39:24

标签: c++ multithreading mutex poco-libraries

这两个代码示例是否等效?

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 个答案:

答案 0 :(得分:8)

它们是等价的。在执行块的最后一行之后,本地不会超出范围。因此,在这种情况下,返回值复制是在锁的保护下进行的。

答案 1 :(得分:3)

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