线程入口函数如下,多个线徎 共用这一个入口函数
unsigned __stdcall CMsgThread::RunThread(void* pThis)
{
CMsgThread* pMsgThread = (CMsgThread*)this;
while(true)
{
data = CMsgQueuePrio::Instance()->getq();//没数据这里会一直等待
pMsgThread->deal(data);
}
return 0;
}线程入口函数会不断调到 getq取数据,取到数据后就调用  deal函数来处理。。如果 getq没有数据, 就会一直等待。。
我的疑问是,程序退出时如果才能安全退出线程呢。

解决方案 »

  1.   

    当然不能一直等啊
    如果没数据,则wait一个退出的信号
      

  2.   

    getq在程序退出时要返回,线程函数的循环要有退出条件
      

  3.   


    没数据也不退出。这个入口函数是不断处理数据的。 只要来数据,就处理,没数据就等待。现在没有。 没准 一会就有了。这个线程在程序执行期间是永远不需要退出的。只是在 关闭程序时才退出线程。 
    我现在用的是  TerminateThread(m_hThread,1),我认为是没有问题的。 因为只有在程序关闭时才调用 。
      

  4.   


    我这样处理你看行不, 在程序退出时 队列里传入一个  退出标志 ,比如"EXIT", 然后 在 while里这么写
    while(true)
        {
            data = CMsgQueuePrio::Instance()->getq();//没数据这里会一直等待
             if(strcmp(const char*)data,"EXIT")==0)
               break;
            pMsgThread->deal(data);
        }这样写,线徎入口函数是退出了。 可是问题来了。因为是多线程 
    我在 waitForSingleObject(m_hThread,INFINITE); 没信号 。如果是一个线程。这样写是没有问题的。
      

  5.   

    这样的思路是不行的。 
    TerminateThread只是结束线程,当线程里有资源操作,如文件、事件、socket等操作时,TerminateThread并不会释放这些资源
      

  6.   

    启动了多少个线程,就有多少个handle啊
      

  7.   


    那么,你有什么更好的办法么?  你的假设  “当线程里有资源操作,如文件、事件、socket等操作时”,在我的这个线程里都不存在。 我的线程就 处理数据而已。 内存也不需要在线程里释放。。我只是在程序退出时才调用  TerminateThread
      

  8.   

    每个线程退出时都需要 CloseHandle(pthreadX->m_hHandle);  
    你可以建立一个线程句柄队列,线程中定义一个BOOL m_bruning;变量,
    while(m_bruning)
    {
     
    }如果需要退出线程,直接使用 pthreadX->m_bruning = FALSE 就OK了啊每个线程的 pthreadX地址不一样的
      

  9.   

    然后怎么判断线程退出, 用 waitformultipleobjects  吗?
      

  10.   

    主线程发送 WM_QUIT 就给所有子线程然后waitformultobject 直到所有的子线程结束可以安全退出主线程
      

  11.   


    WM_QUIT是什么?你说的是mfc程序吗?
      

  12.   

    是的 
    不是用MFC也可以类似处理
    只要在取消息时,判断收到消息需要结束线程就可以了