• 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

  • 相关阅读:
    Centos7上安装docker
    centos如何查看某一目录下每个目录或文件占用磁盘空间大小
    大学毕设参考文献在什么网站搜索
    Spring MVC使用jstl 标签c:forEach 遍历输出双层嵌套List的数据
    JQuery选择器通过click事件获取当前点击对象的id,name,value属性
    利用ajax和servlet实现前后端数据交互(json)
    Java软件工程的弹幕调试原则
    周周总结——时时更新(第4学期,第8周)
    团队软件的NABCD——星遇
    周周总结——时时更新(第4学期,第7周)
  • 原文地址:https://www.cnblogs.com/neking/p/2428168.html
Copyright © 2020-2023  润新知