zoukankan      html  css  js  c++  java
  • CRITICAL_SECTION临界区学习

    定义:不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。每个线程中访问临界资源的那段代码称为临界区(Critical Section)

    每个线程中访问临界资源的那段程序称为临界区(Critical Section)(临界资源是一次仅允许一个线程使用的共享资源)。每次只准许一个线程进入临界区,进入后不允许其他线程进入。不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。

      多个线程中涉及到同一个临界资源的临界区称为相关临界区。   线程进入临界区的调度原则是: ①如果有若干线程要求进入空闲的临界区,一次仅允许一个线程进入。②任何时候,处于临界区内的线程不可多于一个。如已有线程进入自己的临界区,则其它所有 试图进入临界区的线程必须等待。③进入临界区的线程要在有限时间内退出,以便其它线程能及时进入自己的临界区。④如果线程不能进入自己的临界区,则应让出 CPU,避免线程出现“忙等”现象。   如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。

                                                                 ----摘自百度百科

    1.工作中遇到的问题: 同一个类A中有多处同时使用同一个临界区, 即会出现如下情况时

      FuncA()

          | enter---------------FuncB----------------leave

      FuncB()

          |-----------enter-----------------------------------------leave

      如果是一个线程调用FuncA后,另一个线程调用FuncB 则此时发生资源互斥,导致调用FuncB的线程无期限等待,造成未响应

      但如果是同一个线程调用FuncA后 又调用FucnB 则正常执行

      解绝外部线程调用FuncB的方法

      使用windows msg: SendMessage,PostMessage,  在类A的消息处理函数中调用FuncB

  • 相关阅读:
    bzoj3670 [Noi2014]动物园
    bzoj2882 工艺
    bzoj3097 Hash Killer I
    bzoj3729 Gty的游戏
    【BZOJ4555】[TJOI&HEOI2016]求和 斯特林数+NTT
    【bzoj4869】[Shoi2017]相逢是问候 线段树+扩展欧拉定理
    【BZOJ1853】[Scoi2010]幸运数字 容斥原理+搜索
    【BZOJ2839】集合计数 容斥原理+组合数
    【BZOJ3622】已经没什么好害怕的了 容斥原理+dp
    【BZOJ3589】动态树 树链剖分+线段树
  • 原文地址:https://www.cnblogs.com/neking/p/2428168.html
Copyright © 2011-2022 走看看