2009-11-17 295 views
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的复制是一个原子操作?

回答

8

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

3

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

+0

我更关心操作的原子性。代码示例2中首先发生的是:返回值的副本或锁的销毁?如果这不是第一个,那么它是错误的代码。 – StackedCrooked 2009-11-17 20:49:21

+0

据我所知,首先返回值是“构造”,然后所有的自动对象被破坏。 – sellibitze 2009-11-17 20:50:41

+0

我刚刚意识到,如果一个函数返回一个局部变量,它必须在破坏它之前将其复制。卫生署。 – StackedCrooked 2009-11-17 20:54:06