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();
}
但这是否仍然正确取决于发布的代码中遗漏的细节。
锁定两个不同的互斥锁并不是多余的,因为其他线程可能只锁定其中一个。
我是多线程编程的新手。
我现在在做一个串口通信项目,搜索相关代码参考。
我发现有人在 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();
}
但这是否仍然正确取决于发布的代码中遗漏的细节。
锁定两个不同的互斥锁并不是多余的,因为其他线程可能只锁定其中一个。