Рассмотрим следующий код:
void ListenerImpl::attach(boost::shared_ptr<ISubscriber> subscriber)
{
boost::unique_lock<boost::mutex>(mtx);
subscribers.push_back(subscriber);
}
void ListenerImpl::notify(MsgPtr msg)
{
boost::unique_lock<boost::mutex>(mtx);
//notify all subscribers
BOOST_FOREACH(boost::shared_ptr<ISubscriber> subscriber, subscribers){
subscriber->update(msg);
}
}
(Это реализация шаблона наблюдателя, как описано в GoF.) В данном случае вмешательство пользователя состояло в том, чтобы защитить attach () и notify () от одновременногоработает, следовательно, boost :: unique_lock.Цель состояла в том, чтобы защитить контейнер subscribers
.
Но действительно очень трудно заметить, что замки на самом деле являются временными (присмотритесь, имена не назначеныдля них).Таким образом, блокировка мьютекса будет снята немедленно, когда временный объект будет разрушен, то есть код не является потокобезопасным.Я ожидал бы в подобных ситуациях предупреждение компилятора.Что-то вроде «Неиспользуемый временный».
Что еще хуже, cppcheck также не распознает эту ошибку.(cppcheck: инструмент анализа кода ac / c ++ http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page)
Gcc выдает предупреждения о неиспользуемых переменных. Временная переменная - это неиспользуемая переменная и определенно является результатом невнимательности программиста. Итак, почему нет предупреждений втакие случаи? Может быть, слишком сложно обнаружить такие ситуации?