ljhb 发表于 2016-10-27 13:16

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的排列的话,怎么办?

nswcfd 发表于 2016-10-28 14:32

肯定有问题啊。
它需要额外的逻辑/机制保证在1)使用p的时候,至少存在一个p的引用计数。
比如,当把p传递给任何一个异步逻辑(比如timer或workqueue)的时候,需要增加引用计数等。
页: [1]
查看完整版本: kref机制的一个疑问