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

  • 相关阅读:
    hdu 1348【凸包模板】
    hdu 3007【最小圆覆盖-随机增量法模板】
    poj 2187【旋转卡壳模板】
    bzoj 2618【半平面交模板】
    hdu1115【多边形求重心模板】
    bzoj 1006: [HNOI2008]神奇的国度【弦图+LesBFS】
    bzoj 3456: 城市规划【NTT+多项式求逆】
    bzoj 2194: 快速傅立叶之二【NTT】
    bzoj 4555: [Tjoi2016&Heoi2016]求和【NTT】
    bzoj 4842: [Neerc2016]Delight for a Cat【最小费用最大流】
  • 原文地址:https://www.cnblogs.com/neking/p/2428168.html
Copyright © 2011-2022 走看看