多线程处理内存错误,哪位大牛帮我看看问题原因啊,谢谢了 本帖最后由 VisualEleven 于 2013-05-31 14:46:41 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 出错的时候直接打开编译器,然后查看函数的callstack 看了的 没有东西,程序 主线程 和 watch线程还在运行中 但是 worker线程 停了。 看看你work线程函数的参数是否在运行期间有效? _write(int 1, const void * 0x00000000, unsigned int 4084208) line 155 + 3 bytes_flush(_iobuf * 0x00433df8) line 162 + 23 bytes_ftbuf(int 0, _iobuf * 0x00433df8) line 194 + 9 bytesprintf(const char * 0x00430228 `string') line 62 + 14 bytesCSocketInterface::_WatchThread(void * 0x0012ff38) line 179 + 10 bytesKERNEL32! 7c80b729()这是程序蹦溃时的堆栈情况 printf里面出错了。。 这个printf文句如下:printf("WatchTreaad is Working ....\n");这是什么个情况啊 ~!! 回复:VisualEleven 版主大大,我看了一下,应该是有效的,我在使用前进行了判断 也没有失效过。 错误如下:---------------------------Microsoft Visual C++---------------------------Unhandled exception in newTread.exe: 0xC0000005: Access Violation.---------------------------确定 ---------------------------堆栈如下:write_char(int 100, _iobuf * 0x00433df8, int * 0x0083fcbc) line 1083 + 32 bytes_output(_iobuf * 0x00433df8, const char * 0x00430233, char * 0x0083ff20) line 393 + 21 bytesprintf(const char * 0x00430228 `string') line 60 + 18 bytesCSocketInterface::_WatchThread(void * 0x0012ff38) line 179 + 10 bytesKERNEL32! 7c80b729() 弹出错误:---------------------------Microsoft Visual C++ Debug Library---------------------------Debug Assertion Failed!Program: D:\newTread\Debug\newTread.exeFile: dbgheap.cLine: 1076Expression: _pFirstBlock == pHeadFor information on how your program can cause an assertionfailure, see the Visual C++ documentation on asserts.(Press Retry to debug the application)---------------------------终止(A) 重试(R) 忽略(I) ---------------------------后 点击重试 报了错误:---------------------------Microsoft Visual C++---------------------------Unhandled exception in newTread.exe: 0xC0000005: Access Violation.---------------------------确定 ---------------------------堆栈信息如下:free_dbg(void * 0x0087a440, int 1) line 1076 + 43 bytesfree(void * 0x0087a440) line 926 + 11 bytesoperator delete(void * 0x0087a440) line 7 + 9 bytesstd::allocator<WorkMapParam *>::deallocate(void * 0x0087a440, unsigned int 1) line 64 + 38 bytesstd::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Freenode(...) line 596 + 43 bytesstd::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(...) line 362std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(...) line 367 + 29 bytesstd::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(const unsigned long & 15148) line 380std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(const unsigned long & 15148) line 109 + 41 bytesCSocketInterface::_WatchThread(void * 0x0012ff38) line 214KERNEL32! 7c80b729() 该结构里面的数据也一直有效吗?我看了一下,每次worker完成后会进行阻塞状态,watch线程判断worker线程是否为阻塞状态 ,如果阻塞 才会去重置结构,也就是说 如果worker在运行中 结构是不会失效的。 之前写错了 点击重试之后 错误如下:---------------------------Microsoft Visual C++---------------------------User breakpoint called from code at 0x40c3cd ---------------------------确定 ---------------------------堆栈如下:_free_dbg(void * 0x01232c70, int 1) line 1076 + 43 bytesfree(void * 0x01232c70) line 926 + 11 bytesoperator delete(void * 0x01232c70) line 7 + 9 bytesstd::allocator<WorkMapParam *>::deallocate(void * 0x01232c70, unsigned int 1) line 64 + 38 bytesstd::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Freenode(...) line 596 + 43 bytesstd::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(...) line 362std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(...) line 367 + 29 bytesstd::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(const unsigned long & 40837) line 380std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(const unsigned long & 40837) line 109 + 41 bytesCSocketInterface::_WatchThread(void * 0x0012ff38) line 214KERNEL32! 7c80b729()点击:CSocketInterface::_WatchThread(void * 0x0012ff38) line 214跳转到代码: //无任务状态 if(lp->m_stMemberParam.m_stData[i].m_iMissionF == 0 && lp->m_stMemberParam.m_stData[i].m_pLp != NULL) { DWORD id = lp->m_stMemberParam.m_stData[i].m_iID ; //查找任务 并进行相应处理 EnterCriticalSection(&CSocketInterface::g_cs_mission); std::map<DWORD,WorkMapParam *>::iterator lpk ; lpk = lp->m_stMissionMap.find(id); if(lpk != lp->m_stMissionMap.end()) { lpk->second->m_iStatus = lp->m_stMemberParam.m_stData[i].m_iMissionF ; } PutOut("线程[%d] 处理完任务[%d] 结果[%d]",i,id,lpk->second->m_iStatus ); delete lp->m_stMemberParam.m_stData[i].m_pLp; delete lpk->second; lp->m_stMissionMap.erase(lpk->first); lp->m_stMemberParam.m_stData[i]._Init() ; lp->m_iMissionNum-- ; LeaveCriticalSection(&CSocketInterface::g_cs_mission); }_Init方法招行代码如下: _Init() { m_iID = -1; m_iThreadFlg = 1; m_iTimes = -1; m_iStatus = 0; m_iLevel = -1; m_iMissionF = -1; m_tTime = time(NULL); m_CreateTime = time(NULL); m_pLp = NULL ; } lp->m_stMissionMap.erase(lpk->first);lp->m_stMemberParam.m_stData[i]._Init() ;---- map操作是否有问题 我看了一下 操作应该是没有问题的,请问一下,是否有可能 new出来的东西过多了? VS2010中在哪里定义入口点? 如何获取一个二唯数组其中一唯的长度 这些是我在编译没错的情况下想运行的时候出现的提示!谁帮我看看怎么回事啊!谢谢各位大大! 喝可乐,呵呵 如何用ADO操作SQLServer的image字段,并显示图片 急!怎样在vc++的一个类中取得其他类的指针? 刚入门的小白对一些SendMessage的不明白... datagrid更新数据库MFC Debug的資料夾下的exe檔 关于字符串一个问题 MDI文件中的模态对话框获得DOC的成员的问题 替换主窗口出现问题!
_flush(_iobuf * 0x00433df8) line 162 + 23 bytes
_ftbuf(int 0, _iobuf * 0x00433df8) line 194 + 9 bytes
printf(const char * 0x00430228 `string') line 62 + 14 bytes
CSocketInterface::_WatchThread(void * 0x0012ff38) line 179 + 10 bytes
KERNEL32! 7c80b729()这是程序蹦溃时的堆栈情况 printf里面出错了。。 这个printf文句如下:
printf("WatchTreaad is Working ....\n");这是什么个情况啊 ~!!
版主大大,我看了一下,应该是有效的,我在使用前进行了判断 也没有失效过。
---------------------------
Microsoft Visual C++
---------------------------
Unhandled exception in newTread.exe: 0xC0000005: Access Violation.
---------------------------
确定
---------------------------堆栈如下:
write_char(int 100, _iobuf * 0x00433df8, int * 0x0083fcbc) line 1083 + 32 bytes
_output(_iobuf * 0x00433df8, const char * 0x00430233, char * 0x0083ff20) line 393 + 21 bytes
printf(const char * 0x00430228 `string') line 60 + 18 bytes
CSocketInterface::_WatchThread(void * 0x0012ff38) line 179 + 10 bytes
KERNEL32! 7c80b729()
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!Program: D:\newTread\Debug\newTread.exe
File: dbgheap.c
Line: 1076Expression: _pFirstBlock == pHeadFor information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.(Press Retry to debug the application)
---------------------------
终止(A) 重试(R) 忽略(I)
---------------------------
后 点击重试 报了错误:
---------------------------
Microsoft Visual C++
---------------------------
Unhandled exception in newTread.exe: 0xC0000005: Access Violation.
---------------------------
确定
---------------------------
堆栈信息如下:
free_dbg(void * 0x0087a440, int 1) line 1076 + 43 bytes
free(void * 0x0087a440) line 926 + 11 bytes
operator delete(void * 0x0087a440) line 7 + 9 bytes
std::allocator<WorkMapParam *>::deallocate(void * 0x0087a440, unsigned int 1) line 64 + 38 bytes
std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Freenode(...) line 596 + 43 bytes
std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(...) line 362
std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(...) line 367 + 29 bytes
std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(const unsigned long & 15148) line 380
std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(const unsigned long & 15148) line 109 + 41 bytes
CSocketInterface::_WatchThread(void * 0x0012ff38) line 214
KERNEL32! 7c80b729()
我看了一下,每次worker完成后会进行阻塞状态,watch线程判断worker线程是否为阻塞状态 ,如果阻塞 才会去重置结构,也就是说 如果worker在运行中 结构是不会失效的。
---------------------------
Microsoft Visual C++
---------------------------
User breakpoint called from code at 0x40c3cd
---------------------------
确定
---------------------------
堆栈如下:
_free_dbg(void * 0x01232c70, int 1) line 1076 + 43 bytes
free(void * 0x01232c70) line 926 + 11 bytes
operator delete(void * 0x01232c70) line 7 + 9 bytes
std::allocator<WorkMapParam *>::deallocate(void * 0x01232c70, unsigned int 1) line 64 + 38 bytes
std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Freenode(...) line 596 + 43 bytes
std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(...) line 362
std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(...) line 367 + 29 bytes
std::_Tree<unsigned long,std::pair<unsigned long const ,WorkMapParam *>,std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::_Kfn,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(const unsigned long & 40837) line 380
std::map<unsigned long,WorkMapParam *,std::less<unsigned long>,std::allocator<WorkMapParam *> >::erase(const unsigned long & 40837) line 109 + 41 bytes
CSocketInterface::_WatchThread(void * 0x0012ff38) line 214
KERNEL32! 7c80b729()点击:
CSocketInterface::_WatchThread(void * 0x0012ff38) line 214
跳转到代码:
//无任务状态
if(lp->m_stMemberParam.m_stData[i].m_iMissionF == 0 && lp->m_stMemberParam.m_stData[i].m_pLp != NULL)
{
DWORD id = lp->m_stMemberParam.m_stData[i].m_iID ;
//查找任务 并进行相应处理
EnterCriticalSection(&CSocketInterface::g_cs_mission);
std::map<DWORD,WorkMapParam *>::iterator lpk ;
lpk = lp->m_stMissionMap.find(id);
if(lpk != lp->m_stMissionMap.end())
{
lpk->second->m_iStatus = lp->m_stMemberParam.m_stData[i].m_iMissionF ;
}
PutOut("线程[%d] 处理完任务[%d] 结果[%d]",i,id,lpk->second->m_iStatus );
delete lp->m_stMemberParam.m_stData[i].m_pLp;
delete lpk->second;
lp->m_stMissionMap.erase(lpk->first);
lp->m_stMemberParam.m_stData[i]._Init() ;
lp->m_iMissionNum-- ;
LeaveCriticalSection(&CSocketInterface::g_cs_mission);
}_Init方法招行代码如下:
_Init()
{
m_iID = -1;
m_iThreadFlg = 1;
m_iTimes = -1;
m_iStatus = 0;
m_iLevel = -1;
m_iMissionF = -1;
m_tTime = time(NULL);
m_CreateTime = time(NULL);
m_pLp = NULL ;
}
lp->m_stMemberParam.m_stData[i]._Init() ;---- map操作是否有问题