处理有问题的_beginthreadex()原型。
优于C++编译器有更严格的类型检验,该该函数的参数第3个和第6个参数类型是unsigned int,而CreateThread是DWORD,是unsigned long。如果你声明的thrdaddr为DWORD确企图将”地址“交给他,就会出错。有2个解决方案:第一个是将变量声明为unsigned,第二个是将比那两声明为CreateThread中希望的类型,然后在调用_beginthreadex之前,在把它强制转换类型。
以一个C++对象启动一个线程
C++中隐藏的this指针是得我们在启动一个线程时会遇到一些问题。每个非静态的类成员函数都有一个隐藏起来的参数被推入堆栈之中。当编译器需要处理类的成员变量时,他需要这个隐藏参数的帮忙,这就是this参数(一个指针)。
正确做法
为了以一个成员函数启动一个线程,要么使用静态成员函数,要么使用C函数,本质一样,就是通过辅助函数正确建立“调用成员函数时所需要的堆栈” 。使用静态成员函数有一个优点,就是能够处理类的private和protected成员变量(如果是static的话)
使用C++的自动析构特性建立比较安全的Critical Section
class CriticalSection
{
public :
CriticalSection();
~CriticalSection();
void Enter();
void Leave();
private:
CRITICAL_SECTION m_CritSect;
};
CriticalSection::CriticalSection()
{
InitializeCriticalSection(&m_CritSect);
}
CriticalSection::~CriticalSection()
{
DeleteCriticalSection(&m_CritSect);
}
void CriticalSection::Enter()
{
EnterCriticalSection(&m_CritSect);
}
void CriticalSection::Leave()
{
LeaveCriticalSection(&m_CritSect);
}
{
public :
CriticalSection();
~CriticalSection();
void Enter();
void Leave();
private:
CRITICAL_SECTION m_CritSect;
};
CriticalSection::CriticalSection()
{
InitializeCriticalSection(&m_CritSect);
}
CriticalSection::~CriticalSection()
{
DeleteCriticalSection(&m_CritSect);
}
void CriticalSection::Enter()
{
EnterCriticalSection(&m_CritSect);
}
void CriticalSection::Leave()
{
LeaveCriticalSection(&m_CritSect);
}
这个只是一个例子,说明了C++的自动析构在编程中的应用