请帮小弟我分析下下面的这个简单的多线程程序,多谢
请帮我分析下下面的这个简单的多线程程序,谢谢.
现在在试着弄弄多线程,写了下面几行程序,想让线程处理函数的对话框中弹出0,1,2,3
但弹出的老是其他的值.我现在把一部分代码贴上来了,请帮我分析下,谢谢了.
//线程处理函数
DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
int * i=(int *)lpParam;
int j=* i;
char x;
itoa(j,&x,10);
AfxMessageBox(&x);//为什么这里出来的不是0 ,1,2,3啊?
return 0;
}
//下面是分发线程的程序
DWORD dwThreadId, dwThrdParam = 1;
HANDLE hThread[4];
int param[5]={0,1,2,3};
for(int i=0;i <4;i++){
hThread[i] = CreateThread(
NULL,
0,
ThreadFunc,
¶m[i],
0,
&dwThreadId);
}
------解决方案--------------------
两个问题:
1. itoa()不是那么用的,你需要自己提供缓冲区给itoa。例如:
char buf[16];
itoa(value, buf, 10);
你的写法会造成内存越界访问。当然,这不是AfxMessageBox输出随机数的原因。
2. 分发线程的int param[5]={0,1,2,3};数组使用的内存会在退出所在函数的时候释放掉,lpParam所指的内容就是不确定的了。
------解决方案--------------------
小弟啊,原因就在于你的param不是全局的,你把param设成全局的就OK了.
现在在试着弄弄多线程,写了下面几行程序,想让线程处理函数的对话框中弹出0,1,2,3
但弹出的老是其他的值.我现在把一部分代码贴上来了,请帮我分析下,谢谢了.
//线程处理函数
DWORD WINAPI ThreadFunc( LPVOID lpParam )
{
int * i=(int *)lpParam;
int j=* i;
char x;
itoa(j,&x,10);
AfxMessageBox(&x);//为什么这里出来的不是0 ,1,2,3啊?
return 0;
}
//下面是分发线程的程序
DWORD dwThreadId, dwThrdParam = 1;
HANDLE hThread[4];
int param[5]={0,1,2,3};
for(int i=0;i <4;i++){
hThread[i] = CreateThread(
NULL,
0,
ThreadFunc,
¶m[i],
0,
&dwThreadId);
}
------解决方案--------------------
两个问题:
1. itoa()不是那么用的,你需要自己提供缓冲区给itoa。例如:
char buf[16];
itoa(value, buf, 10);
你的写法会造成内存越界访问。当然,这不是AfxMessageBox输出随机数的原因。
2. 分发线程的int param[5]={0,1,2,3};数组使用的内存会在退出所在函数的时候释放掉,lpParam所指的内容就是不确定的了。
------解决方案--------------------
小弟啊,原因就在于你的param不是全局的,你把param设成全局的就OK了.