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++)
{
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()运行的时候,只运行最后一次传递的参数呢?
求解释?谢谢!
解决方案 »
- GetModuleHandle GetModuleFileName MapFileAndCheckSum
- CControlBar控件的浮动问题???
- 怎样将一个工程中的dialog、menu等移植到另一个工程中去?
- 简单问题:用ShellExecute打开URL后,如何判断其是否打开成功?打开后如何将其关闭?
- 请教:VC6.0,将头文件加入工程中编译,和不加入工程中编译有何区别?好像都可以编译过
- 在Win32程序中 怎么加入图标 图片?
- 怎样让工具条固定?
- 嵌入Object的页面,IE因为多次刷新而崩溃,请问是什么原因导致的??
- 在线等! release模式 itoa出错!
- 有没有对两台机器的内存同步问题感兴趣的!进来一块讨论讨论!!!!!!!1
- 多线程输出问题,SuspendThread与ResumeThread问题
- CreateDialog问题
贴ThreadProc代码
{
ResumeThread(hThread[i]);
}明显的bug
j是循环计数器,你循环内,使用的是i变量,当然是牛头对不上了。
#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
#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] = 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);
}