1. 临界区对象不是内核对象,因此不能继承,不能跨进程,也不能用waitfor什么的函数来限定时间等待。这个很好理解,你想想WaitFor要求传一个句柄,而临界区对象的类型都不是句柄,也不能用CloseHandle来关闭,怎么可能会能让WaitForXXX搞了。
2. 临界区对象使用前必须初始化,不初始化会崩溃,这是我的亲历。
3. 线程进入临界区之前会先自旋那么几次,所有自旋锁都失败了之后会创建一个内核对象然后等待这个内核从而进入到内核模式。
4. Enter和Leave必须匹配,每Enter一次,就得Leave一次,这又是可恶的计数机制。参见下面的代码:
typedef struct _RTL_CRITICAL_SECTION {
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
//
// The following three fields control entering and exiting the critical
// section for the resource
//
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread; // from the thread's ClientId->UniqueThread
HANDLE LockSemaphore;
ULONG_PTR SpinCount; // force size on 64-bit systems when packed
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
这是临界区对象的定义,看见
RecursionCount

本文详细介绍了Windows中临界区对象(CriticalSection)的使用注意事项,包括初始化、进入和离开的匹配、TryEnterCriticalSection的使用、自旋锁的概念以及如何处理异常情况。强调了自旋锁在多核与单核CPU下的不同行为,并给出了初始化和使用临界区对象的实验观察结果。
最低0.47元/天 解锁文章
5370





