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();
}

Но будет ли это по-прежнему правильно, зависит от деталей, которые не были включены в опубликованный код.

Блокировка двух разных мьютексов не является излишней, поскольку другие потоки могут заблокировать только один из них.

Другие вопросы по тегам