晕啊,
我在主程序中通过for循环创建多个线程时出现了奇怪的问题,/////////////////////////////////////////
主程序中HANDLE hMyThread[2]; // 线程句柄
CWinThread* pT;for(int i = 0; i < 2; i++ )
{
   //构造一个结构体struct Mystruct mystruct作为参数,其中一个变量 num = i; 
   pT = AfxBeginThread( (AFX_THREADPROC)MyThreadProc, (void*)&mystruct );
   hMyThread[i] = pT->m_hThread;   //通过Sleep(1000);或其他动作拖延一点时间
}
/////////////////////////////////////////DWORD MyThreadProc(void* pD)
{
   Mystruct *pst = (Mystruct*) 
   将pst->num显示出来;   //
   线程实际工作
   //
   return 0;
}照理说:应该显示0和1,但是我的程序却显示1和1,
即显示的都是for循环中最后一次创建线程时提供的参数,
但是如果我在for循环中//通过Sleep(1000);或其他动作一点时间,
却能正确显示出0和1,
怎么会这样呢?
难道通过同一个线程函数创建多个线程还有很多讲究?

解决方案 »

  1.   

    mystruct 在线程间共享?那么是同步的问题。
      

  2.   

    不是的,每次循环重新创建Mystruct mystruct,不是共享的
    for(int i = 0; i < 2; i++ )
    {
       Mystruct mystruct;
       mystruct.num = i;
       //设置mystruct的其他参数,   pT = AfxBeginThread( (AFX_THREADPROC)MyThreadProc, (void*)&mystruct );
       hMyThread[i] = pT->m_hThread;   //通过Sleep(1000);或其他动作拖延一点时间
    }
      

  3.   

    CRITICAL_SECTION g_cs;
    DWORD MyThreadProc(void* pD)
    {
       EnterCriticalSection(&g_cs);
       Mystruct *pst = (Mystruct*) 
       将pst->num显示出来;
       LeaveCriticalSection(&g_cs);   //
       线程实际工作
       //
       return 0;
    }
      

  4.   


    for(int i = 0; i < 2; i++ )
    {
       //构造一个结构体struct Mystruct mystruct作为参数,其中一个变量 num = i; 
       pT = AfxBeginThread( (AFX_THREADPROC)MyThreadProc, (void*)&mystruct );
       hMyThread[i] = pT->m_hThread;   //通过Sleep(1000);或其他动作拖延一点时间
    }
    所在线程为a创建的两个线程为b,c
    如果不加入Sleep(1000);则运行的次序可能是
    a->b->c或a->c->b,总之a很有可能在b,c运行之前结束bc都显示1
    加入Sleep那么a将被挂起,那么在a还没有创建c时,b已经运行结束(显示数字)b显示0c现实1
      

  5.   

    我改成HANDLE hMyThread[2]; // 线程句柄
    CWinThread* pT;
    Mystruct mystruct[2]; // 参数数组for(int i = 0; i < 2; i++ )
    {
       mystruct[i].num = i;
       //设置mystruct的其他参数,   pT = AfxBeginThread( (AFX_THREADPROC)MyThreadProc, (void*)&mystruct[i] );
       hMyThread[i] = pT->m_hThread;
    }DWORD MyThreadProc(void* pD)
    {
       Mystruct *pst = (Mystruct*) pD;
       cout<<"线程"<<pst->num<<"开始";
       //
       线程实际工作
       //
       cout<<"线程"<<pst->num<<"结束";
       return 0;
    }能正确显示
    线程0开始
    线程0开始
    线程1结束但却一直没有显示
    线程2结束怎么会这样呢?
      

  6.   

    我觉得这个语句hMyThread[i] = pT->m_hThread;没有意义
    因为当线程结束后,线程对象会被自动删除,那对象里的句柄也没意义了
    而且,可能还没有执行到这个语句,线程就结束了
      

  7.   

    是不是你第二个线程在处理数据时提前返回而没有运行到   cout<<"线程"<<pst->num<<"结束";
    或者根本线程就没有结束
      

  8.   

    for(int i = 0; i < 2; i++ )
    {
       mystruct[i].num = i;
       //设置mystruct的其他参数,   pT = AfxBeginThread( (AFX_THREADPROC)MyThreadProc, (void*)&mystruct[i] );
       hMyThread[i] = pT->m_hThread;
    }
    i的最大值是1,怎么会出现2?
      

  9.   

    超出了变量的作用范围,在线程函数中要保证传进来的参数是有效的!
    在你没有加Sleep时,主调函数可能已经返回,局部变量就没有意义了,
    然后在你的工作者线程里即还在使用,结果当然就错了.
    即使加上Sleep,虽然结果是正确的,用法也是不对的!所以,应该声明为全局变量或者是静态变量.