struct PointInfo
{
      int    x;
      int    y;
      HANDLE hEvent;
};
//第一种方法
void XXXFunction()
{
   PointInfo pinfo;   //栈变量
   pinfo.x = 100;
   pinfo.y = 200;
   pinfo.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
   CreateThread(NULL,0,tWorker,&pinfo,0,NULL);
   WaitforSingleObject(pinfo.hEvent,0xffffffff);
}
DWORD WINAPI tWorker(LPVOID p)
{
   PointInfo pinfo = *(PointInfo*)p;
   SetEvent(pinfo.hEvent);
   CloseHandle(pinfo.hEvent);
   
   do something....
   
   return 0;   
}
//第二种方法
void XXXFunction()
{
   PointInfo* pinfo = new PointInfo;   //堆变量
   pinfo->x = 100;
   pinfo->y = 200;
   CreateThread(NULL,0,tWorker,pinfo,0,NULL);
}
DWORD WINAPI tWorker(LPVOID p)
{
   PointInfo* pinfo = (PointInfo*)p;
     do something....
      delete pinfo;   return 0;   
}问题:
哪种方法好,或者有更好的方法请指教?
如果需要不停的产生短寿命的线程
第一种方法需要经常CreateEvent和CloseHandle,第二种需要经常new和delete,不知道哪种对系统的冲击更大?

解决方案 »

  1.   

    跨线程,当然只能用堆,new/delete
      

  2.   

    stack变量来创建线程。。只是你机器配置好..异步创建线程时,线程创建的快.那个stack的变量代码函数块还没返回。。
      

  3.   

    void XXXFunction()
    {
      PointInfo pinfo; //栈变量
      pinfo.x = 100;
      pinfo.y = 200;
      pinfo.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
      CreateThread(NULL,0,tWorker,&pinfo,0,NULL);
      WaitforSingleObject(pinfo.hEvent,0xffffffff);
    }
    这个有问题吧
    PointInfo pinfo 是局部变量,如果线程要运行很长时间,要出现线程还在运行,而pinfo 已经不再存在,内存会出现访问错误。
      

  4.   

    各有利弊吧,如果LZ需要启动大量短时间线程,我觉得一个比较可行的方案是在类变量中定义一个可重复使用的循环队列,把类的对象(也就是this指针)当做参数传给线程;可以避嫌不必要的内核切换(事件等待),也可以避免频繁的new/delete操作。
    不过这种频繁的启动和关闭线程本身就是不好的设计,非常浪费系统的资源(主要是cpu资源),为什么不用线程池呢?或者固定数量的worker thread?
      

  5.   

    有点乱,能用栈肯定是栈效率高,但是栈的作用域太不灵活,没有堆上的灵活。 相对创建 销毁所产生的开销,new delete是最小的了,应该比CreateEvent要小。