嵌套临界区是否有效?
例如,这有效吗?
CRITICAL_SECTION cs;
::InitializeCriticalSection( &cs );
::EnterCriticalSection( &cs ); // First level
::EnterCriticalSection( &cs ); // Second level
/* do some stuff */
::LeaveCriticalSection( &cs ); // Second level
::LeaveCriticalSection( &cs ); // First level
::DeleteCriticalSection( &cs );
显然,我永远不会故意这样做,但是如果这是由于函数调用而发生的,例如调用“第一级”来锁定复杂(例如搜索)算法的对象和“第二级”,该怎么办?在该对象的访问器函数中被调用?
For example, would this be valid?
CRITICAL_SECTION cs;
::InitializeCriticalSection( &cs );
::EnterCriticalSection( &cs ); // First level
::EnterCriticalSection( &cs ); // Second level
/* do some stuff */
::LeaveCriticalSection( &cs ); // Second level
::LeaveCriticalSection( &cs ); // First level
::DeleteCriticalSection( &cs );
Obviously, I would never intentionally do this, but what if this were to come about as a result of function calls such that the "first level" gets called to lock an object for a complex (e.g. search) algorithm and the "second level" gets called in that object's accessor functions?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

发布评论
评论(3)
夏有森光若流苏2024-12-09 11:13:41
验证其他两个帖子。快速查看 WinDbg 中的 Critical 部分会发现,cricital 部分维护一个整数变量来保存递归计数。
0:001> dt RTL_CRITICAL_SECTION
+0x000 DebugInfo : Ptr32 _RTL_CRITICAL_SECTION_DEBUG
+0x004 LockCount : Int4B
+0x008 RecursionCount : Int4B
+0x00c OwningThread : Ptr32 Void
+0x010 LockSemaphore : Ptr32 Void
+0x014 SpinCount : Uint4B
递归计数 -
一个线程可以多次获取临界区。这个领域
指示同一线程获取临界区的次数。经过
默认情况下,该字段的值为0,表示没有线程拥有该
关键部分。
~没有更多了~
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
是的,在已经位于同一临界区内部时进入该临界区是有效的。来自文档:
Yes it is valid to enter the same critical section while already inside it. From the docs: