suspendthread 多个线程, 为什么 resumeThread后 只是开启了最后一个线程?
代码大致如下:
for( int i = 0; i < 5; i++)
{
    HANDLE hThread[i] = CreateThread(NULL,0,ThreadProc,NULL,CREATE_SUSPENDED,NULL);
}for( int j = 0; j < 5; j++ )
{
    ResumeThread(hThread[i]);
}
大致是这样子,他们会访问同意线程,线程里使用互斥变量同步。
代码我做了精简,实际要传递一个和变量i有关的参数,即分别传递(1,2,3,4,5)。
为什么当ResumeThread()运行的时候,只运行最后一次传递的参数呢?
求解释?谢谢!

解决方案 »

  1.   

    介个HANDLE hThread[i] = ...能编译通过?还是临时例子?
    贴ThreadProc代码
      

  2.   

    for( int j = 0; j < 5; j++ )
    {
       ResumeThread(hThread[i]);
    }明显的bug
    j是循环计数器,你循环内,使用的是i变量,当然是牛头对不上了。
      

  3.   


    #include "stdafx.h"
    #include "stdio.h"
    #include <windows.h>HANDLE hMutex = CreateMutex(NULL,false,NULL);DWORD WINAPI ThreadProc(  LPVOID lpParameter )
    {
    WaitForSingleObject(hMutex,INFINITE);
    int *p = (int*)(lpParameter);
    printf("%d\n",*p);
    ReleaseMutex(hMutex);
    return 0;
    }int main(int argc, char* argv[])
    {
    HANDLE hThread[5]; for( int i = 0; i < 5; i++)
    {
    hThread[i] = CreateThread(NULL,0,ThreadProc,(LPVOID)&i,CREATE_SUSPENDED,NULL);
    }

    for( int j = 0; j < 5; j++ )
    {
    ResumeThread(hThread[j]);
    WaitForSingleObject(hThread[j],INFINITE);
    } for( int k = 0; k < 5; k++ )
    {
    CloseHandle(hThread[k]);
    }

    return 0;
    }我希望输出的结果是:
    1
    2
    3
    4
    5
    但是实际结果是:
    5
    5
    5
    5
    5
      

  4.   


    #include "stdafx.h"
    #include "stdio.h"
    #include <windows.h>HANDLE hMutex = CreateMutex(NULL,false,NULL);DWORD WINAPI ThreadProc(  LPVOID lpParameter )
    {
    WaitForSingleObject(hMutex,INFINITE);
    int *p = (int*)(lpParameter);
    printf("%d\n",*p);
    ReleaseMutex(hMutex);
    return 0;
    }int main(int argc, char* argv[])
    {
    HANDLE hThread[5]; for( int i = 0; i < 5; i++)
    {
    hThread[i] = CreateThread(NULL,0,ThreadProc,(LPVOID)&i,CREATE_SUSPENDED,NULL);
    }

    for( int j = 0; j < 5; j++ )
    {
    ResumeThread(hThread[j]);
    WaitForSingleObject(hThread[j],INFINITE);
    } for( int k = 0; k < 5; k++ )
    {
    CloseHandle(hThread[k]);
    }

    return 0;
    }
    我希望输出的结果是:
    1
    2
    3
    4
    5
    但是实际结果是:
    5
    5
    5
    5
    5
    求解释,共同交流?谢谢!!
      

  5.   

    for( int i = 0; i < 5; i++)
       {
       hThread[i] = CreateThread(NULL,0,ThreadProc,(LPVOID)&i,CREATE_SUSPENDED,NULL);
       }这有问题,你传递了i的指针地址进去。当某个线程内去访问这个指针指向的int数值时,它可能是个不确定的值,已经被循环++改变了实际内容例如,第一个线程取到 i=1时的地址。但是当线程读这个地址时。这个地址指向的整数进入了下一个循环被自加了,变成了2.那么第一个线程,第二个线程可能取到的都是2.因为线程执行的顺序不一定和创建顺序一致.所有的线程其实访问的都是同一个整型数据的指针地址。这个指针地址存放的数据又被主线程的循环修改,最终结果是5.由于主线程循环快(这个快不一定,只是你的测试环境,主线程循环快),子线程中也存在wait的操作,当wait完成,所取得的指针地址中的数据早已被主线程循环修改了。所以你应该这样做
    int nParam[5];
    for( int i = 0; i < 5; i++)
    {
       nParam[i] = i;
       hThread[i] = CreateThread(NULL,0,ThreadProc,(LPVOID)&(nParam[i]),CREATE_SUSPENDED,NULL);
    }