scoped_lock внутри lock_guard, это лишнее?
Я новичок в многопоточном программировании. Сейчас я занимаюсь проектом связи через последовательный порт и ищу соответствующие коды для справки. Я нашел код, который кто-то использовал внутри
lock_guard
как показано ниже:
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();
}
Согласно этому сообщению , я думаю, что эти два просто блокируют мьютекс. И вызывается
A()
, так что, может быть
scoped_lock
внутри
B()
не нужен и его можно удалить. Это правильно?
1 ответ
Они блокируют разные мьютексы. Имеет ли это смысл, зависит от того, что
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();
}
Но будет ли это по-прежнему правильно, зависит от деталей, которые не были включены в опубликованный код.
Блокировка двух разных мьютексов не является излишней, поскольку другие потоки могут заблокировать только один из них.