• 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)

  • 相关阅读:
    VMware安装Centos7超详细过程(图文)
    linux中yum与rpm区别
    xshell连接本地虚拟机中的centos
    虚拟主机安装 CentOS 8 出现 “ pane is dead ” 故障解决方案
    python字符串前面添加(u,r,b)的功能
    from . import XXX
    我关注的博客
    并发与并行的区别
    GSAP学习(二)——载入
    GSAP学习(一)——什么是GSAP
  • 原文地址:https://www.cnblogs.com/zhidao-chen/p/3853273.html
Copyright © 2020-2023  润新知