智能指针RefBase、LightRefBase的incStrong、decStrong是不是线程不安全的?
(源代码:frameworks\base\libs\utilsRefBase.cpp/h)具体问题参见下面代码。
void RefBase::decStrong(const void* id) const
{
...
const int32_t c = android_atomic_dec(&refs->mStrong);
//1)假设A线程执行decStrong()到此处,如果此时线程B获得执行权,新创建sp智能指针,指向同一个对象obj;
//2)然后执行权又回到线程A,接下来,decStrong()未做任何判断,直接delete掉了对象obj;
//3)此后线程B再次获得执行权时,则其指针变成了野指针,指向一块垃圾内存,然后操作该指针时会出错。
//是否会有该问题?如果存在问题,则在Android系统中,对该问题,是否有其他处理机制?
if (c == 1) {
const_cast<RefBase*>(this)->onLastStrongRef(id);
if ((refs->mFlags&OBJECT_LIFETIME_WEAK) != OBJECT_LIFETIME_WEAK) {
delete this;
}
}
...
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货