【发布时间】:2011-09-24 23:45:27
【问题描述】:
考虑以下代码:
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 对未使用的变量发出警告。这里的临时变量是一个未使用的变量,肯定是程序员疏忽的结果。 那么,为什么在这种情况下没有警告呢?也许发现这种情况太复杂了?
【问题讨论】:
-
我犯了类似的错误,也检查这个问题:stackoverflow.com/questions/914861/…
-
您是否尝试将 -Wall -Wextra 作为编译器的命令行参数?不过我对 C++ 并不熟悉..
-
是否保证一个未命名的变量(称为临时)被立即销毁?我原以为它会一直存在到它定义的范围结束。
-
@ereOn:它一直存在到语句结束:/
-
@Matthieu M.:好的,谢谢。很高兴知道。 :)
标签: c++ thread-safety gcc-warning temporaries