zoukankan      html  css  js  c++  java
  • win32多线程(三) 死锁

    任何时候当一段代码需要两个(或更多)资源时,都有潜在性的死锁。

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

    以上代码,

    假设下面两次调用发生在不同线程的同一个时间点:
    线程ASw apLists(home_address_list, work_address_list);
    线程BSw apLists(work_address_list, home_address_list);

    在线程A的SwapLists() 的第一次EnterCriticalSection() 之后,发生了context switch(译注:也就是调度程序选换了一个线程),然后线程B执行了它的SwapLists()操作,两个线程于是会落入“我等你,你等我”的轮回。线程A需要work_address_list,线程B需要hom e_address_list,而双方都掌握有对方所要的东西。这种情况称为死锁(deadlock)

    在SwapLists()  中所发生的死锁问题,是因为它必须等待两个critical section。

    WaitForMultipleObjects() 函数。它允许你对
    操作系统发出“等待”的要求,直到所有指定的对象都激发才返回。但critical section不是内核对象,所以我们必须使用另外的办法来解决死锁问题。比如 互斥器(Mutexes)

  • 相关阅读:
    修改电脑安装路径
    快读模板
    ECNU XCPC 2021 OCTOBER TRAINING #1
    System.AccessViolationException处理,HandleProcessCorruptedStateExceptions
    网页打包到apk
    去除服务器的heder信息
    outlook
    华为机试题:计算链路长度
    华为机试题:求子区间面积和
    华为机试题: IPv6地址压缩
  • 原文地址:https://www.cnblogs.com/zhidao-chen/p/3853273.html
Copyright © 2011-2022 走看看