scoped_lock里面lock_guard,是多余的吗?

scoped_lock inside lock_guard, is it redundant?

我是多线程编程的新手。 我现在在做一个串口通信项目,搜索相关代码参考。 我发现有人在 lock_guard 中使用 scoped_lock 的代码如下:

void B(){
     boost::mutex::scoped_lock b_lock(b_mutex);
     /* do something */
}

void A(){
     const std::lock_guard<std::mutex> a_lock(a_mutex);
     /* do something  */
     B();
}

根据,我认为这两个只是为了锁定互斥量。而 B()A() 调用,所以也许 B() 里面的 scoped_lock 是不需要的,可以去掉。对吗?

他们锁定不同的互斥体。这是否有意义取决于 do something 是什么。例如它可以是:

void B(){
     boost::mutex::scoped_lock b_lock(b_mutex);
     /* do something that needs b_mutex locked */
}

void A(){
     const std::lock_guard<std::mutex> a_lock(a_mutex);
     /* do something that needs a_mutex locked  */
     B();
}

好像A可以改成

void A(){
     { 
         const std::lock_guard<std::mutex> a_lock(a_mutex);
         /* do something that needs a_mutex locked  */
     }
     B();
}

但这是否仍然正确取决于发布的代码中遗漏的细节。

锁定两个不同的互斥锁并不是多余的,因为其他线程可能只锁定其中一个。