Рассмотрим следующий код:
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: инструмент анализа кода c/С++ http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page)
Gcc выдает предупреждения о неиспользуемых переменных. Временная здесь неиспользуемая переменная, и, безусловно, результат невнимательности программиста. Итак, почему в подобных случаях нет предупреждений? Может быть, слишком сложно обнаружить такие ситуации?