帮忙看段简单的程序!该怎么解决
帮忙看段简单的程序!
程序如下:
#include <stdio.h>
#include <windows.h>
DWORD WINAPI HelloFunc(LPVOID arg)
{
int *a ;
a = (int* ) (arg);
printf( "Helle func!%d\n ",*a);
return 0 ;
}
void main()
{
int a[1];
LPVOID arg;
HANDLE hThread[4];
for(int index = 0; index < 4; index++)
{
*a = index;
arg = (LPVOID)a;
hThread[ index ] =
CreateThread(NULL,0,HelloFunc,arg,0,NULL);
//Sleep(1);
}
Sleep(20);
}
我运行了很多次,为什么输出总是:
Helle func!3
Helle func!3
Helle func!3
Helle func!3
------解决方案--------------------
解决办法是将注释掉的Sleep(1);改为Sleep(0);
原因是在
for(int index = 0; index < 4; index++)
{
*a = index;
arg = (LPVOID)a;
hThread[ index ] =
CreateThread(NULL,0,HelloFunc,arg,0,NULL);
//Sleep(1);
}
这个循环中没有线程切换,等这个循环结束后,a[0]的值是3,切换到CreateThread的4个线程中的某个时,它打印a[]中的值,当然是3。
------解决方案--------------------
楼上说得有一定道理,不过即使按上面的修改也不一定行,因为就线程何时被调度我们根本无法控制
程序如下:
#include <stdio.h>
#include <windows.h>
DWORD WINAPI HelloFunc(LPVOID arg)
{
int *a ;
a = (int* ) (arg);
printf( "Helle func!%d\n ",*a);
return 0 ;
}
void main()
{
int a[1];
LPVOID arg;
HANDLE hThread[4];
for(int index = 0; index < 4; index++)
{
*a = index;
arg = (LPVOID)a;
hThread[ index ] =
CreateThread(NULL,0,HelloFunc,arg,0,NULL);
//Sleep(1);
}
Sleep(20);
}
我运行了很多次,为什么输出总是:
Helle func!3
Helle func!3
Helle func!3
Helle func!3
------解决方案--------------------
解决办法是将注释掉的Sleep(1);改为Sleep(0);
原因是在
for(int index = 0; index < 4; index++)
{
*a = index;
arg = (LPVOID)a;
hThread[ index ] =
CreateThread(NULL,0,HelloFunc,arg,0,NULL);
//Sleep(1);
}
这个循环中没有线程切换,等这个循环结束后,a[0]的值是3,切换到CreateThread的4个线程中的某个时,它打印a[]中的值,当然是3。
------解决方案--------------------
楼上说得有一定道理,不过即使按上面的修改也不一定行,因为就线程何时被调度我们根本无法控制