关于CRITICAL_SECTION代码出错
定义了一个类CQueue, 声名了一个对象数组Queue[NUM]
在自己的类里建立了一个CRITICAL_SECTION,但是在结束要调用NUM个DeleteCriticalSection,但是的就会出错(注意不是全部)。这里观察了一下出错的和没有出错的在删除前DebugInfo,LockCount.. 等等各个字段的值不一样: 出错的好像前两个是空,后几个指针有值,其它的则相反。
下面有以下几个问题:
1,CRITICAL_SECTION各个字段的含义是什么呀?
DebugInfo,LockCount,RecursionCount,OwningThread,LockSemaphore,SpinCount
2,能不能分析一下出错可能的原因(感觉逻辑没有什么错啊,先InitializeCriticalSection,然后调用的地方 EnterCriticalSection,LeaveCriticalSection )?
谢谢大家
[解决办法]
建立了一个CRITICAL_SECTION,但是在结束要调用NUM个DeleteCriticalSection
只建立了一个,为什么要调用num次delete?
[解决办法]
//Use MFC in a Static Library#include "stdafx.h"#include <windows.h>#include "stdio.h"#include "afxmt.h"int i=2;CCriticalSection Cmysection;DWORD WINAPI clientthread(LPVOID lpparam){ int num=(int)lpparam; while(true) { Cmysection.Lock(); //可以使Cmysection.Lock()到Cmysection.Unlock(); //这段代码在同一时刻只允许一个线程操作 if(num==1) printf("hthread1在操作\t"); else printf("hthread2在操作\t"); Sleep(500); i++; printf("%d,%d\n",num,i); Cmysection.Unlock(); } return 0;}int main(int argc, char* argv[]){ int num = 1; HANDLE hthread1,hthread2; DWORD dwthreadid; char szBuff[MAX_PATH]; hthread1=CreateThread(NULL,0,clientthread,(LPVOID)num,0,&dwthreadid); if(hthread1==NULL) { printf("fail55\n"); } hthread2=CreateThread(NULL,0,clientthread,(LPVOID)(num+1),0,&dwthreadid); if(hthread2==NULL) { printf("fail55\n"); } gets(szBuff); CloseHandle(hthread1); CloseHandle(hthread2); return 0;}
[解决办法]
会不会是你Delete的时候对象已经销毁了,
或者是你Delete之后还有线程在调用Enter 或者Leave
[解决办法]
临界区保护的东西,越少越好
包装CCriticalSection,在构造函数里init,在析构函数里delete,
[解决办法]
临界区保护的东西,越少越好
包装CCriticalSection,在构造函数里init,在析构函数里delete,
这个说到点子上了!你为什么不把类里边创建的东西在类消亡的时候处理掉呢?这样,critical section的生存期根本不用你来操心了