首页
学习
活动
专区
圈层
工具
发布

互斥锁
EN

Stack Overflow用户
提问于 2009-11-17 20:39:23
回答 2查看 2.6K关注 0票数 6

下面的两个代码示例是否等效?

代码语言:javascript
复制
Poco::ProcessHandle::PID ProcessRunner::processId() const
{
    Poco::ProcessHandle::PID pid = 0;
    mMutex.lock();
    pid = mPID;
    mMutex.unlock();
    return pid;
}

代码语言:javascript
复制
Poco::ProcessHandle::PID ProcessRunner::processId() const
{
    Poco::ScopedLock<Poco::Mutex> lock(mMutex);
    return mPID;
}

在第二个示例中,

  • :在返回值复制之后,锁会超出作用域吗?如果返回了一个有许多复制指令的对象,这将很重要。如果只返回int值,那么
  • 是必需的锁?或者,复制int是原子操作吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-17 20:47:09

它们是等价物。在执行块的最后一行之前,局部变量不会超出范围。因此,在这种情况下,返回值副本是在锁的保护下进行的。

票数 8
EN

Stack Overflow用户

发布于 2009-11-17 20:45:38

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1751611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档