#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
求解释,共同交流?谢谢!!
并且可不可以写个函数可以通过句柄hThread[i],让第i个线程执行?我想到的是
类似void exeThread(HANLE hThread); //hThread用于接收传入的线程句柄,好像
不行啊?

解决方案 »

  1.   

    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);
    }