kref机制的一个疑问
kref机制就是增加一个atomic_t refcnt,当访问时+1,访问完成时-1,避免在访问过程中释放。
比如
kref_get(kref *obj)
{
atomic_inc(&obj->refcnt);
}
kref_put(kref *obj)
{
if(atomic_dec_and_test(&obj->refcnt)){
call_kref_release_cb(obj);
}
}
考虑下面两个场景
1. if(p)
4 kref_get(p);
2.if(atomic_dec_and_test(&p->refcnt))
3 free(p);
如果发生的时序按照1234的排列的话,怎么办?
肯定有问题啊。
它需要额外的逻辑/机制保证在1)使用p的时候,至少存在一个p的引用计数。
比如,当把p传递给任何一个异步逻辑(比如timer或workqueue)的时候,需要增加引用计数等。
页:
[1]