【发布时间】:2010-10-25 14:18:39
【问题描述】:
我在调试一个多线程的应用程序,发现CRITICAL_SECTION的内部结构。我发现 CRITICAL_SECTION 的数据成员 LockSemaphore 很有趣。
看起来LockSemaphore 是一个自动重置事件(不是顾名思义的信号量),当线程第一次等待被其他线程锁定的Critcal Section 时,操作系统会静默创建此事件。
现在,我想知道关键部分总是更快吗?事件是一个内核对象,每个关键部分对象都与事件对象相关联,那么与其他内核对象(如 Mutex)相比,Critical Section 如何更快?此外,内部事件对象实际上如何影响关键部分的性能?
这是CRITICAL_SECTION的结构:
struct RTL_CRITICAL_SECTION
{
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
ULONG_PTR SpinCount;
};
【问题讨论】:
-
还请记住,CriticalSection 实施细节可能因操作系统版本而异。查看这些细节可能很有启发性,但不要依赖它们,因为它们可能会发生变化。
-
它肯定是 NT5 中的信号量
标签: c++ winapi synchronization critical-section