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)

  • 相关阅读:
    selenium之WebDriver API
    python开发之面试题
    python开发之协程
    Python爬虫
    Python基础
    Django-搭建win7虚拟环境-virtualenv
    Linux系列
    Python知识点
    Python知识点
    Python基础-生物信息:找出基因,生物学家使用字母A、C、T和G构成的字符串建模一个基因组。
  • 原文地址:https://www.cnblogs.com/zhidao-chen/p/3853273.html
Copyright © 2011-2022 走看看