kernel 中定时器回调函数,死锁如何解决 ?
时间:2010-12-29
来源:互联网
本帖最后由 tuibo 于 2010-12-29 19:02 编辑
双向链表 AList : ... <=> A1 <=> A2 <=> A3 <=> A4 ...
该链表每个元素有一个定时器成员,如 A2 有个定时器成员, 定时器用来做超时删除A2操作,A2的地址作为参数传给超时回调函数。
另外还有一个进程Pa,可能根据命令行来删除链表中的元素 A2。
定时器和进程Pa都有可能发生删除A2操作,要进行互斥。
进程Pa :
struct list_head * A2
LOCK(AList)
A2 = search(AList, key) /*根据关键字key 查找到A2*/
if(del_timer(A2->timer)){ /*如果删除定时器成功,则删除并释放A2*/
list_del(A2->list)
FREE(A2)
}
UNLOCK(AList)
定时器 回调函数:
void timeout_handle(void * data) {
struct list_head * A2 = data;
LOCK(Alist)
list_del(A2);
FREE(A2)
UNLOCK(AList)
}
这样写有个问题
可能会死锁。 del_timer 的时候要对 timer链表加锁。 而timeout_handle运行的时候,已经加了timer链表锁了。
双向链表 AList : ... <=> A1 <=> A2 <=> A3 <=> A4 ...
该链表每个元素有一个定时器成员,如 A2 有个定时器成员, 定时器用来做超时删除A2操作,A2的地址作为参数传给超时回调函数。
另外还有一个进程Pa,可能根据命令行来删除链表中的元素 A2。
定时器和进程Pa都有可能发生删除A2操作,要进行互斥。
进程Pa :
struct list_head * A2
LOCK(AList)
A2 = search(AList, key) /*根据关键字key 查找到A2*/
if(del_timer(A2->timer)){ /*如果删除定时器成功,则删除并释放A2*/
list_del(A2->list)
FREE(A2)
}
UNLOCK(AList)
定时器 回调函数:
void timeout_handle(void * data) {
struct list_head * A2 = data;
LOCK(Alist)
list_del(A2);
FREE(A2)
UNLOCK(AList)
}
这样写有个问题
可能会死锁。 del_timer 的时候要对 timer链表加锁。 而timeout_handle运行的时候,已经加了timer链表锁了。
作者: tuibo 发布时间: 2010-12-29
多核条件下
作者: tuibo 发布时间: 2010-12-29
QUOTE:
这样写有个问题
可能会死锁。 del_timer 的时候要对 timer链表加锁。 而timeout_handle运行的时候,已经加了timer链表锁了。
可能会死锁。 del_timer 的时候要对 timer链表加锁。 而timeout_handle运行的时候,已经加了timer链表锁了。
那也就是定时器在运行的时候,你单独的删除操作其实执行不成功,也就是获取不了锁。
而如果你正在通过命令执行删除时,定时器也无发执行,因为你已经持有锁了。
所以我想了解你说的死锁,是怎么产生的。你的链表访问用的是什么锁
作者: Godbach 发布时间: 2010-12-29
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28