zoukankan      html  css  js  c++  java
  • 第八章 用户方式中线程的同步(3)

    1. 关键代码段与循环锁

           当线程访问另一个线程拥有的关键代码段时,调用线程就立即被置于等待状态。即该线程从用户态转入内核态。调用EnterCriticalSection函数时它使用循环锁进行循环,设法多次取得该资源。只有每次都失败时,该线程才转入内核态以便进入等待状态。

            BOOL InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION pcs, DWORD dwSpinCount);

           将循环锁放入关键代码,第一个参数是关键代码段结构的地址,第二个参数是使线程等待之前它试图获得资源时想要循环锁循环迭代的次数。可以是00 x 0 0 FFFFFF之间的任何数字(单处理器计算机上时该参数忽略)。

    DWORD SetCriticalSectionSpinCount(PCRITICAL_SECTION pcs, DWORD dwSpinCount);

    用于改变设置关键代码段的循环次数(指导原则,保护对进程的堆栈进行访问的关键代码段使用的循环次数是 4000次)。

    1. 错误处理

    InitializeCriticalSection函数可能运行失败,它分配了一个内存块以便系统得到一些内部调试信息。如果该内存的分配失败,就会出现一个STATUS_NO_MEMORY异常情况。可以使用结构化异常处理来捕捉这个异常。

    如果两个或多个线程同时争用关键代码段,则关键代码段将使用一个事件内核对象。如果内存不足,关键代码段可能被争用同时系统可能无法创建必要的事件内核对象。这时EnterCriticalSention函数将会产生一个EXCEPTION_INVALID_HANDLE异常。可以使用结构化异常处理方法来跟踪错误。也可以用InitializeCriticalSectionAndSpinCount函数,确保设置了dwSpinCount 参数的高信息位。当该函数发现高信息位已经设置时,它就创建该事件内核对象,并在初始化时将它与关键代码段关联起来。如果事件无法创建,该函数返回 FA L S E

     

  • 相关阅读:
    2.1.1 Speed Limit
    2.1.2 骑自行车的最短时间
    1.3.1提高实数精度的范例
    1.2.2一个数可以有多少种用连续素数之和表示
    求二倍关系的个数 1.2.1
    求平均值
    原生JS 购物车及购物页面的cookie使用
    基于Jquery的商城商品图片的放大镜效果(非组件)
    商城商品购买数量增减的完美JS效果
    弹性布局各种坑爹兼容
  • 原文地址:https://www.cnblogs.com/dyufei/p/2573987.html
Copyright © 2011-2022 走看看