考虑以下代码:
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 对未使用的变量发出警告。这里的临时变量是一个未使用的变量,肯定是程序员疏忽的结果。那么,为什么在这种情况下没有警告呢?也许发现这种情况太复杂了?