程序运行正常,可是一段时间后出现“内存不能为“read””的问题,本人对线程不熟,恳请高手指点,部分代码如下:typedef struct group
{
int m_omp;
CString str;
}Group;long WINAPI MyThreadProc1( long pParam )
{ ..... return 1;
}long WINAPI MyThreadProc( long pParam )
{ int thread=int(pParam)+1;
group m_str;
m_str.str=LoadCode();
printf("%d-%s\n",thread,m_str.str);
unsigned long * p1=NULL;
HANDLE hthread1[20];
int m_omp;
for(m_omp=0;m_omp<k_count;m_omp++)
{
m_str.m_omp=m_omp+1; hthread1[m_omp]=::CreateThread(NULL,m_omp,(LPTHREAD_START_ROUTINE)MyThreadProc1,(LPVOID) &m_str,0,p1);
Sleep(1000);
} DWORD dw1;
dw1=WaitForMultipleObjects(k_count,hthread1,true,1000);
if(dw1==WAIT_TIMEOUT)
{
for(int i=0;i<k_count;i++)
{
TerminateThread(hthread1[i],0);
}
} Sleep(2000); return 1;
}int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
... while(1)
{ unsigned long * p=NULL;
HANDLE hthread[20];
int ik;
for(ik=0;ik<10;ik++)
{
hthread[ik]=::CreateThread(NULL,ik,(LPTHREAD_START_ROUTINE)MyThreadProc,LPVOID(ik),0,p);
Sleep(1000);
} DWORD dw;
dw=WaitForMultipleObjects(10,hthread,true,7*1000);
if(dw==WAIT_TIMEOUT)
{
for(int i=0;i<10;i++)
{
TerminateThread(hthread[i],0);
}
}
Sleep(2000); }
return nRetCode;
}
{
int m_omp;
CString str;
}Group;long WINAPI MyThreadProc1( long pParam )
{ ..... return 1;
}long WINAPI MyThreadProc( long pParam )
{ int thread=int(pParam)+1;
group m_str;
m_str.str=LoadCode();
printf("%d-%s\n",thread,m_str.str);
unsigned long * p1=NULL;
HANDLE hthread1[20];
int m_omp;
for(m_omp=0;m_omp<k_count;m_omp++)
{
m_str.m_omp=m_omp+1; hthread1[m_omp]=::CreateThread(NULL,m_omp,(LPTHREAD_START_ROUTINE)MyThreadProc1,(LPVOID) &m_str,0,p1);
Sleep(1000);
} DWORD dw1;
dw1=WaitForMultipleObjects(k_count,hthread1,true,1000);
if(dw1==WAIT_TIMEOUT)
{
for(int i=0;i<k_count;i++)
{
TerminateThread(hthread1[i],0);
}
} Sleep(2000); return 1;
}int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
... while(1)
{ unsigned long * p=NULL;
HANDLE hthread[20];
int ik;
for(ik=0;ik<10;ik++)
{
hthread[ik]=::CreateThread(NULL,ik,(LPTHREAD_START_ROUTINE)MyThreadProc,LPVOID(ik),0,p);
Sleep(1000);
} DWORD dw;
dw=WaitForMultipleObjects(10,hthread,true,7*1000);
if(dw==WAIT_TIMEOUT)
{
for(int i=0;i<10;i++)
{
TerminateThread(hthread[i],0);
}
}
Sleep(2000); }
return nRetCode;
}
调试结果是0xC0000005: Access Violation
指向出错指令:7C921010 cmp dword ptr [edx+14h],0
指向出错指令:7C921010 cmp dword ptr [edx+14h],0感觉是变量的作用域出错了。在线程间的指针、(对这两者而言的)全局变量,地址访问问题。这种事,我的线程里出现好几次。好像局部的static变量能解决一点问题。但没仔细跟踪,也不知从何跟踪。只是用了之后就不出问题了。
m_str为局部变量,MyThreadPorc结束后不可用,可以用:
group *m_str = new group;
CreateThread(NULL,m_omp,(LPTHREAD_START_ROUTINE)MyThreadProc1,(LPVOID) m_str,0,p1);
然后在MyThreadProc1中释放m_str.