Так что если ваша переменная "mtx" является указателем. Что произойдет, если вы измените его и передадите вместо него "& mtx".

отрим следующий код:

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&nbsp;контейнер.

Но действительно очень трудно заметить, чтозамки на самом деле просто временные&nbsp;(присмотритесь, для них не назначены имена). Таким образом, блокировка мьютекса будет немедленно снята, когда временный объект будет разрушен, то есть код не является потокобезопасным. Я ожидал бы в подобных ситуациях предупреждение компилятора. Что-то вроде «Неиспользованный временный».

Хуже того, cppcheck тоже не признает эту ошибку. (cppcheck: инструмент анализа кода c / c ++http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page)

Gcc выдает предупреждения о неиспользуемых переменных. Временная здесь - неиспользуемая переменная, и определенно результат невнимательности программиста. Итак, почему нет предупреждений в подобных случаях? Может быть, слишком сложно обнаружить такие ситуации?