读书人

关于CRITICAL_SECTION代码出错解决思路

发布时间: 2012-03-09 16:54:58 作者: rapoo

关于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?
[解决办法]

C/C++ code
//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的生存期根本不用你来操心了

读书人网 >C++

热点推荐