嵌套使用两个不同的Win32 CRITICAL_SECTION是否合法?
嵌套使用两个不同的Win32 CRITICAL_SECTION是否合法?
没问题的,这种嵌套使用不同Win32 CRITICAL_SECTION的操作完全合法!Win32的临界区机制本身就支持这类场景,核心只要你遵守两个基本规则就行:一是每个临界区都得提前完成正确初始化,二是进入和退出临界区的调用必须严格配对。
举个你提供的例子来说明,假设CS_ResultSetSpace和CS_HHeap都是在其他地方已经初始化好的Win32 CRITICAL_SECTION对象:
I.e., where
CS_ResultSetSpaceandCS_HHeapare Win32CRITICAL_SECTIONobjects initialized elsewhere:
extern int SomeCondition(); extern void InitializeResultSet(int i); ... DWORD CALLBACK ThreadProc(_In_ LPVOID lParameter) { HANDLE hHeap = GetProcessHeap(); int i = 0; EnterCriticalSection(&CS_ResultSetSpace); for(; i < RESULT_SET_SIZE; i++) { InitializeResultSet(i); if(SomeCondition()) // 这里代码虽未写完,但能看出嵌套使用的逻辑框架 } // 重要提醒:实际代码里一定要记得配对调用LeaveCriticalSection(&CS_ResultSetSpace)哦!
另外还要多提个醒:虽然嵌套不同临界区合法,但要特别留意死锁风险。比如如果有两个线程,线程A先获取CS_ResultSetSpace再尝试获取CS_HHeap,而线程B反过来先拿CS_HHeap再等CS_ResultSetSpace,这种情况下两个线程就会互相卡住、完全动不了。所以在设计多线程逻辑时,一定要统一好临界区的获取顺序,避免这种情况发生。
内容来源于stack exchange
相关产品推荐
相关产品推荐

