第4章 同步控制 Synchronization ----死锁(DeadLock)

Jeffrey Richter 在他所主持的 Win32 Q&A 专栏(Microsoft Systems Journal,1996/07)中曾经提到过,Windows NT 和 Windows 95 在管理 dangling critical sections 时有极大的不同。在 Windows NT 之中,如果一个线程进入某个 critical section 而在未离开的情况下就结束,该 critical section 会被永远锁住。然而在 Windows 95 中,如果发生同样的事情,其他等着要进入该 critical section 的线程,将获准进入。这基本上是一个严重的问题,因为你竟然可以在你的程序处于不稳定状态时进入该 critical section。

死锁(Deadlock)

为每一个链表(linked list)准备一个 critical section 之后,我却开启了另一个问题。请看下面这个用来交换两个链表内容的函数:

void SwapLists(List *list, List *list2)
{
    List *tmp_list;
    EnterCriticalSection(list1->critical_sec);
    EnterCriticalSection(list2->critical_sec);
    tmp->list = list1->head;
    list1->head = list2->head;
    list2->head = temp->list;
    LeaveCriticalSection(list1->critical_sec);
    LeaveCriticalSection(list2->critical_sec);
}

看出问题了吗?假设下面两次调用发生在不同线程的同一个时间点:
    线程A SwapLists(home_address_list, work_address_list);    
    线程B SwapLists(work_address_list, home_address_list);

是调度程序选换了一个线程),然后线程B执行了它的 SwapLists()操作,两个线程于是会落入“我等你,你等我”的轮回。线程A需要 work_address_list,线程B需要 home_address_list,而双方都掌握有对方所要的东西。这种情况称为死锁(deadlock),或称为死亡拥抱(The Deadly Embrace)。
任何时候当一段代码需要两个(或更多)资源时,都有潜在性的死锁阴影。死锁的情况可能非常复杂,许多线程的独立性彼此纠缠在一起。虽然有一些算法可以侦测并仲裁死锁状态,基本上它们仍嫌过于复杂。对大部分程序而言,最好的政策就是找出一种方法以确保死锁不会发生。稍后你会看到,强迫将资源锁定,使它们成为 "all-or-nothing"(要不统统获得,要不统统没有),可以阻止死锁的发生。

转载于:https://www.cnblogs.com/azbane/p/7560068.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值