同一个线程函数启动多次,为什么会出问题呢?求解!
DWORD WINAPI processQueue(LPVOID lp)
{
int *p=(int *)lp;
printf("i is %d\n", *p));
return 0;
}
int main(int argc, char* argv[])
{
HANDLE thread[10];
DWORD dw[10];
int nArr[10] = {0,1,2,3,4,5,6,7,8,9};
thread[0]=CreateThread(NULL,0,processQueue,&nArr[0],0,&dw[0]);
thread[1]=CreateThread(NULL,0,processQueue,&nArr[1],0,&dw[1]);
thread[2]=CreateThread(NULL,0,processQueue,&nArr[2],0,&dw[2]);
thread[3]=CreateThread(NULL,0,processQueue,&nArr[3],0,&dw[3]);
thread[4]=CreateThread(NULL,0,processQueue,&nArr[4],0,&dw[4]);
thread[5]=CreateThread(NULL,0,processQueue,&nArr[5],0,&dw[5]);
thread[6]=CreateThread(NULL,0,processQueue,&nArr[6],0,&dw[6]);
thread[7]=CreateThread(NULL,0,processQueue,&nArr[7],0,&dw[7]);
thread[8]=CreateThread(NULL,0,processQueue,&nArr[8],0,&dw[8]);
thread[9]=CreateThread(NULL,0,processQueue,&nArr[9],0,&dw[9]);
WaitForMultipleObjects(10,thread,TRUE,1000);
CloseHandle(thread);
return 0;
}
定义一个线程函数processQueue,在main函数中创建10次线程,分别传进不同的参数,
然后在线程函数中打印传进的参数,为什么会出现下面的问题,有些值打印了
多次,但是10个数都打印出来了。难道线程执行了不止10次吗?
i is 0
i is 1
i is 2
i is 3
i is 3
i is 4
i is 6
i is 5
i is 5
i is 8
i is 7
i is 9
个人认为线程中的局部变量应该是公用的,但是参数lp也是公用的吗?
请高手解答!
[解决办法]
俺不知道有啥问题,学习了.
[解决办法]
线程的局部变量不是公用的
每个线程有自己的线程栈
lz的代码在我这run很好,10个都打印了,而且无重复
[解决办法]
线程执行优先级问题。同一级别的线程执行时的次序是随机的,而这个随机性很大程度上和你用的编译器有关。可能有的线程还没有等到执行主函数就退出了,而有的则执行了两次以上。
[解决办法]
10个数输出的顺序有差异,这个我明白,但是从楼主的代码来看,输出两个相同的数,我就不能理解了。
坐等高手解答
[解决办法]
只要不存在在共享资源,那就不存在问题吧,它们是不同的。
[解决办法]
LZ有没有把动态链接库改成MTD?
MTD的话printf就是线程安全的了。