+ -
当前位置:首页 → 问答吧 → kernel 中定时器回调函数,死锁如何解决 ?

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链表锁了。

作者: tuibo   发布时间: 2010-12-29

多核条件下

作者: tuibo   发布时间: 2010-12-29



QUOTE:
这样写有个问题
     可能会死锁。  del_timer 的时候要对 timer链表加锁。 而timeout_handle运行的时候,已经加了timer链表锁了。


那也就是定时器在运行的时候,你单独的删除操作其实执行不成功,也就是获取不了锁。

而如果你正在通过命令执行删除时,定时器也无发执行,因为你已经持有锁了。

所以我想了解你说的死锁,是怎么产生的。你的链表访问用的是什么锁

作者: Godbach   发布时间: 2010-12-29