- 主题:趁机问一下我一直没搞明白的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的排列的话,怎么办?
--
FROM 183.48.33.*
kernel是要求"必须在传递副本指针之前执行kref_get()",这样保证把指针给别人之前,p的引用计数是1,不会被谁抢先释放掉了。也就是保证引用计数从0变为1的过程中没有race,否则必须做额外的同步。
windows下有类似的机制,叫Run-Down Protection
https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/run-down-protection
--
修改:z16166 FROM 61.48.130.*
FROM 61.48.130.*
【 在 iwannabe 的大作中提到: 】
: kref机制就是增加一个atomic_t refcnt,当访问时+1,访问完成时-1,避免在访问过程
: 中释放。
: 比如
: ...................
不会有这种乱序,这样都能乱的话代码还怎么写....,没有任何保障了,啥代码都要考虑乱序....
实际上,刚才那个乱序的帖子,是两个线程在执行,如果代码合成一下由一个线程来执行,结果都不会错,编译器和处理器会解决这个问题。
真正要注意乱序的地方,其实不是那么多。对纯应用来说就更少了。
你这种case,是资源边界保护的问题,是多线程执行的症状。比如用互斥信号量做互斥访问。释放p的过程中不让获取p等等。
--
修改:beanspower FROM 111.197.20.*
FROM 111.197.20.*