Critical Section Objects(临界区域)的使用

 Critical Section Objects(临界区域)的使用 (2006-08-09 10:34:37)
转载
   
使用步骤:
1.初始化使用InitializeCriticalSectio n或InitializeCriticalSectio nAndSpinCount函数。
2.进程获取共享空间的访问权使用EnterCriticalSection或TryEnterCriticalSection函数。
3.进程释放共享空间的所有权使用LeaveCriticalSection函数。
4.删除临界区域 使用DeleteCriticalSection函数。
函数原型:
  1. void InitializeCriticalSection(
      LPCRITICAL_SECTION lpCriticalSection
    );
  2. BOOL InitializeCriticalSectionAndSpinCount( LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount );
  3.  
    void EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection );
  4.  
     
    BOOL TryEnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection );
  5.  
     
     
    void LeaveCriticalSection( LPCRITICAL_SECTION lpCriticalSection );
  6.  
     
     
     
    void DeleteCriticalSection( LPCRITICAL_SECTION lpCriticalSection );
说明:
1.InitializeCriticalSectio n/InitializeCriticalSectio nAndSpinCount差别?
InitializeCriticalSectio n函数的返回值为空并且不会创建事件内核对象,比较节省系统资源,但是一旦发生两个或多个线程争用关键代码段的情况,如果内存不足,关键代码段可能被争用,同时系统可能无法创建必要的事件内核对象。这时EnterCriticalSection函数将会产生一个EXCEPTION_INVALID_HANDLE异常。这个错误非常少见。如果想对这种情况有所准备,可以有两种选择。可以使用结构化异常处理方法来跟踪错误。当错误发生时,既可以不访问关键代码段保护的资源,也可以等待某些内存变成可用状态,然后再次调用EnterCriticalSection函数。
另一种选择是使用InitializeCriticalSectio nAndSpinCount,第二个参数dwSpinCount中,传递的是在使线程等待之前它试图获得资源时想要循环锁循环迭代的次数。这个值可以是0至0x00FFFFFF之间的任何数字。如果在单处理器计算机上运行时调用该函数,该参数被忽略,并且始终设置为0。使用InitializeCriticalSectio nAndSpinCount函数创建关键代码段,确保设置了dwSpinCount参数的高信息位。当该函数发现高信息位已经设置时,它就创建该事件内核对象,并在初始化时将它与关键代码段关联起来。如果事件无法创建,该函数返回FALSE。可以更加妥善地处理代码中的这个事件。如果事件创建成功,EnterCriticalSection将始终都能运行,并且决不会产生异常情况(如果总是预先分配事件内核对象,就会浪费系统资源。只有当代码不能容许EnterCriticalSection运行失败,或者有把握会出现争用现象,或者预计进程将在内存非常短缺的环境中运行时,才能预先分配事件内核对象)。
另外,InitializeCriticalSectio nAndSpinCount函数不支持windowsCE系统。

2.TryEnterCriticalSection和EnterCriticalSection的差别是什么?
如果EnterCriticalSection将一个线程置于等待状态,那么该线程在很长时间内就不能再次被调度。实际上,在编写得不好的应用程序中,该线程永远不会再次被赋予CPU时间。TryEnterCriticalSection函数决不允许调用线程进入等待状态。它的返回值能够指明调用线程是否能够获得对资源的访问权。TryEnterCriticalSection发现该资源已经被另一个线程访问,它就返回FALSE。在其他所有情况下,它均返回TRUE。运用这个函数,线程能够迅速查看它是否可以访问某个共享资源,如果不能访问,那么它可以继续执行某些其他操作,而不必进行等待。如果TryEnterCriticalSection函数确实返回了TRUE,那么CRITICAL_SECTION的成员变量已经更新。Windows98没有可以使用的TryEnterCriticalSection函数的实现代码。

你可能感兴趣的:(exception,windows)