for(int u=0;u<m_threads;u++)
    {
       iPra.i=u;
       AfxBeginThread(ThreadDown,&iPra);
//     UINT ThreadDown(LPVOID iP)为全局函数ThreadDown的定义    }
//我在全局函数ThreadDown中设置了显示传入的iPra.i的对话框,结果当m_threads设置为5的时候,显示1,2,3,4,4。0不显示,4重复显示了。我把u=0改成u=2,m_threads设置为其他值也是这样情况:第一个线程没有显示,最后一个线程重复显示了,为什么?怎么解决?谢谢!

解决方案 »

  1.   

    问题在 AfxBeginThread 后,每个线程看到的都是同一个 iPra 地址,并且你的循环在不断改变这个 iPra 地址内 i 的值,不过我觉得应该都显示 4 才对,因为在你的循环执行完之前系统因该来不及做线程切换,执行新的线程,除非多 cpu 或 循环中调用了 sleep
      

  2.   

    显示的值应该取决于子线程执行到 ThreadDown 将 iPra.i 的值取出的位置时,这个循环已经创建到第几个线程了。显示 1,2,3,4,4 是因为 thread_0 取出 iPra.i 值时,主线程已经在执行第二次循环并完成了 iPra.i=u; 赋值。最后 thread_4 取出 iPra.i 时, 主线程已经退出了循环,iPra.i 仍保持 4。
      

  3.   

    不需要按顺序来显示呢?
    int u=0;
    CCriticalSection cs;
    ......
    while (u<3)
    {
      cs.Lock();
      AfxBeginThread(ThreadDown,NULL);
    }
    全局函数ThreadDown的定义如下
    UINT ThreadDown(LPVOID iP)
    {
       int i=u;
       u++;
       cs.Unlock();
       CString iname;
       iname.Format("%d",i);
       AfxMessageBox(iname);
        ....
    }
    应该想让它分别显示0,1,2。结果显示0,1,2,3。(对顺序不要求)
    请问怎么解决?