suspendthread 多个线程, 为什么 resumeThread后 只是开启了最后一个线程? 代码大致如下:解决办法
suspendthread 多个线程, 为什么 resumeThread后 只是开启了最后一个线程? 代码大致如下:
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()运行的时候,只运行最后一次传递的参数呢?
求解释?谢谢!
------解决方案--------------------
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);
}
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()运行的时候,只运行最后一次传递的参数呢?
求解释?谢谢!
------解决方案--------------------
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);
}