这是一道中级题. 高级题其实还不如这道题 1) 指出以下示意代码的错误之处
CRITICAL_SECTION g_CriticalSection=NULL;
char *g_string=NULL;
class MyClass
{
public:
int InitInstance();
int threadA();
};
int MyClass::Init()
{
InitCriticalSection(&g_CriticalSection);
CreateThread(threadA,...);
}
int MyClass::threadA()
{
EnterCriticalSection(g_CriticalSection)
if(g_string!=NULL)
{
delete g_string;
}
g_string = new char[1024];
...
delete g_string;
g_string = NULL;
ExitCriticalSection(g_CriticalSection)
return 0;
}2) 如果MyClass改成如下定义,请写出实现上面功能的代码
class MyClass
{
static const CRITICAL_SECTION m_CriticalSection;
public:
MyClass() { EnterCriticalSection(m_CriticalSection); }
~MyClass(){ ExitCriticalSection(m_CriticalSection); }
};
CRITICAL_SECTION g_CriticalSection=NULL;
char *g_string=NULL;
class MyClass
{
public:
int InitInstance();
int threadA();
};
int MyClass::Init()
{
InitCriticalSection(&g_CriticalSection);
CreateThread(threadA,...);
}
int MyClass::threadA()
{
EnterCriticalSection(g_CriticalSection)
if(g_string!=NULL)
{
delete g_string;
}
g_string = new char[1024];
...
delete g_string;
g_string = NULL;
ExitCriticalSection(g_CriticalSection)
return 0;
}2) 如果MyClass改成如下定义,请写出实现上面功能的代码
class MyClass
{
static const CRITICAL_SECTION m_CriticalSection;
public:
MyClass() { EnterCriticalSection(m_CriticalSection); }
~MyClass(){ ExitCriticalSection(m_CriticalSection); }
};
static int threadA();
delete[] g_string;
晕。
int MyClass::InitInstance();
1. 什么时候调用DeleteCriticalSection()???????
2. delete[] g_string;
第二题
去掉中的static const CRITICAL_SECTION m_CriticalSection;的static?? 只是猜测..
{
InitCriticalSection(&g_CriticalSection);
...
}
而在:int MyClass::threadA()
{
EnterCriticalSection(g_CriticalSection)
...
ExitCriticalSection(g_CriticalSection)
return 0;
}
(&g_CriticalSection)?
(g_CriticalSection)?
请解释一下
为什么在:int MyClass::Init()
{
InitCriticalSection(&g_CriticalSection);
...
}
而在:int MyClass::threadA()
{
EnterCriticalSection(g_CriticalSection)
...
ExitCriticalSection(g_CriticalSection)
return 0;
}
(&g_CriticalSection)?
(g_CriticalSection)?
请解释一下
>>(&g_CriticalSection)?
>>(g_CriticalSection)?题目中的代码基本是伪代码,仅示意作用,我想不应该细究具体的参数形式
CRITICAL_SECTION看样子不是一个宏就是一个结构,那么g_CriticalSection=NULL;
就不好解释:如果是一个指针宏,那么宏的命名风格不好:完全看不出是个指针;如果是一个结构,那么这个初始化就是错误的。
另一个问题:线程体设成public有问题,这样没有办法避免外部对这个线程函数的直接调用。所以似乎应该把threadA()声明成private;如果这个类是一个线程类的框架,需要根据需要改写线程体,那么应该把threadA声明成virtual protected。
{
public:
int InitInstance();
static int threadA();
};
VOID EnterCriticalSection(
LPCRITICAL_SECTION lpCriticalSection // critical section
);
VOID InitializeCriticalSection(
LPCRITICAL_SECTION lpCriticalSection // critical section
);
都是windows API
ExitCriticalSection 我没找到,我想应该是下面这个吧
VOID LeaveCriticalSection(
LPCRITICAL_SECTION lpCriticalSection // critical section
);
线程中间有一个return -1;没有LeaveCriticalSection():(考点一 )
线程应该为static(考点二)
利用class的构造和析构调用Enter...和Leave...(临界区)(考点三)
在c++的类定义中不应该出现这样的定义吧!
加入myclass有两个继承类,大家想想看,会出现什么问题!
设为static我想就是为了解决这个问题!
请多指教!
EnterCriticalSection(g_CriticalSection)
try{
if(g_string!=NULL)
{
delete g_string;
}
g_string = new char[1024];
...
delete g_string;
g_string = NULL;
}
__finally{
ExitCriticalSection(g_CriticalSection);
}
return 0;
用SingLock类什么的
你在说什么啊,在C++程序中使用windows的结构化异常处理?
这样做不好的,要用只能用C++异常处理
如果下列情况出现:
MyClass m1;
m1.InitInstance();
m1.threadA();
//m1的线程一直在执行,有实列m2也要执行threadA;
MyClass m2;
m2.InitInstance();
m2.threadA();
//m2照样可以执行,因为它也做了InitInstance动作。
//所以会出现问题。应该使用构造函数来实现。
char *g_string=NULL;
class MyClass
{
public:
int InitInstance();
int threadA();
};
int MyClass::Init()
{
InitCriticalSection(&g_CriticalSection);
CreateThread(threadA,...);
}
int MyClass::threadA()
{
EnterCriticalSection(g_CriticalSection)
if(g_string!=NULL)
{
delete g_string;
}
g_string = new char[1024];
...
delete g_string;
g_string = NULL;
ExitCriticalSection(g_CriticalSection)
return 0;
}
CRITICAL_SECTION g_CriticalSection;
char *g_string=NULL;
class MyClass
{
public:
int InitInstance();
int threadA();
};
int MyClass::Init()
{
InitCriticalSection(&g_CriticalSection);
CreateThread(threadA,...);
}
int MyClass::threadA()
{
EnterCriticalSection(&g_CriticalSection)
if(g_string!=NULL)
{
delete [] g_string;
}
g_string = new char[1024];
...
delete [] g_string;
g_string = NULL;
ExitCriticalSection(&g_CriticalSection)
return 0;
}
这点确实记不清楚了> 线程应该为static(考点二)
> 利用class的构造和析构调用Enter...和Leave...(临界区)(考点三)
当时我也只看出了这2点
{
static const CRITICAL_SECTION m_CriticalSection;
}
如何初始化m_CriticalSection?强制类型转换?
构造 多个 MyClass 对象时所碰到的问题:从而导致对g_CriticalSection的访问冲突,其冲突结果大家也都看得出来.而且有可能导致g_CriticalSection占用内存的释放问题.
char *g_string=NULL;
class MyClass
{
public:
int InitInstance();
static int threadA();
};
int MyClass::Init()
{
InitCriticalSection(&g_CriticalSection);
CreateThread(threadA,...);
}
int MyClass::threadA()
{
EnterCriticalSection(&g_CriticalSection)
try{
if(g_string!=NULL)
{
delete [] g_string;
}
g_string = new char[1024];
...
delete [] g_string;
g_string = NULL;
}
catch(...)
{
LeaveCriticalSection(&g_CriticalSection);
return -1;
}
LeaveCriticalSection(&g_CriticalSection);
return 0;
}
int MyClass::~myclass()
{
DeleteCriticalSection(&g_CriticalSection);
}
InitCriticalSection(&g_CriticalSection);
会有什么后果,我觉得这个初始化只需要一次。
{
..............
}
下面这样可以吗?
g_string = NULL;
没有看出static的问题。 另外关于继承和构造也考了不少。 建议大家看看inside c++ . 后来看了effective c++都明白了。 算是交了学费了。
char *g_string=NULL;class MyClass::InitCriticalSection(&g_CriticalSection)//这里我加的
{
static const CRITICAL_SECTION m_CriticalSection;
public:
MyClass() { EnterCriticalSection(m_CriticalSection); }
~MyClass(){ ExitCriticalSection(m_CriticalSection); }
};下面就当是实现吧int MyClass::Init()
{
CreateThread(threadA,...);
}
int MyClass::threadA()
{
if(g_string!=NULL)
{
delete g_string;
}
g_string = new char[1024];
...
delete g_string;
g_string = NULL;
return 0;
}