Так что если ваша переменная "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 контейнер.

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

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

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

Ответы на вопрос(3)

Ваш ответ на вопрос