大大大菜鸟

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

处理有问题的_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);
}

这个只是一个例子,说明了C++的自动析构在编程中的应用

posted on 2010-12-20 14:12  月蚀之罪  阅读(228)  评论(0编辑  收藏  举报