请教关于临界区结构CRITICAL_SECTION各成员变量多代表的意义以及如何通过里边的各个成员变量看出锁异常等

解决方案 »

  1.   

    struct RTL_CRITICAL_SECTION
    {
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
    LONG LockCount;
    LONG RecursionCount;
    HANDLE OwningThread;
    HANDLE LockSemaphore;
    ULONG_PTR SpinCount;
    };以下各段对每个字段进行说明。DebugInfo 此字段包含一个指针,指向系统分配的伴随结构,该结构的类型为 
    RTL_CRITICAL_SECTION_DEBUG。这一结构中包含更多极有价值的信息,也定义于 WINNT.H 中。我们稍后将对其进行更深入地研究。LockCount 这是临界区中最重要的一个字段。它被初始化为数值 -1;此数值等于或大于 0 
    时,表示此临界区被占用。当其不等于 -1 时,OwningThread 字段(此字段被错误地定义于 WINNT.H 中 — 应当是 DWORD 而不是 
    HANDLE)包含了拥有此临界区的线程 ID。此字段与 (RecursionCount -1) 数值之间的差值表示有多少个其他线程在等待获得该临界区。RecursionCount 
    此字段包含所有者线程已经获得该临界区的次数。如果该数值为零,下一个尝试获取该临界区的线程将会成功。OwningThread 此字段包含当前占用此临界区的线程的线程标识符。此线程 ID 与 
    GetCurrentThreadId 之类的 API 所返回的 ID 相同。LockSemaphore 
    此字段的命名不恰当,它实际上是一个自复位事件,而不是一个信号。它是一个内核对象句柄,用于通知操作系统:该临界区现在空闲。操作系统在一个线程第一次尝试获得该临界区,但被另一个已经拥有该临界区的线程所阻止时,自动创建这样一个句柄。应当调用 
    DeleteCriticalSection(它将发出一个调用该事件的 CloseHandle 调用,并在必要时释放该调试结构),否则将会发生资源泄漏。SpinCount 仅用于多处理器系统。MSDN 
    文档对此字段进行如下说明:“在多处理器系统中,如果该临界区不可用,调用线程将在对与该临界区相关的信号执行等待操作之前,旋转 dwSpinCount 
    次。如果该临界区在旋转操作期间变为可用,该调用线程就避免了等待操作。”旋转计数可以在多处理器计算机上提供更佳性能,其原因在于在一个循环中旋转通常要快于进入内核模式等待状态。此字段默认值为零,但可以用 
    InitializeCriticalSectionAndSpinCount API 将其设置为一个不同值。
      

  2.   


    你好,能否把DebugInfo的里边的成员也说一下