List使用疑义-list iterator not dereferenceable
List使用疑问--list iterator not dereferenceable
大家好:
我最近在写一个DSP与上位机数据传输的MFC程序,使用Socket套接字。
在MFC程序中,主线程负责接收数据,接收到的数据按4字节转化为UINT32类型存进一个STL list双向链表中,同时开启一个子线程,负责从list中取出数据进行处理(子线程开启的更早,一直在等待)。
主线程部分很简单,只是把数据放进链表
list<UINT32> Data;
UINT32 sslen;
Data.push_back(sslen);
子线程负责从list中取出数据进行处理,它开启的更早,一直在等待,Data中有数据才处理,并且取出一个数据之后马上将这个数据从链表中删除;
UINT ThreadFunc(LPVOID pParm)//线程函数的定义
{
CAFM_TestDlg *pInfo=(CAFM_TestDlg*)pParm;
list<UINT32>::iterator t;
while (1)//一直循环处理
{
int sslen;
t = pInfo->Data.begin();
while(t!=pInfo->Data.end())//使用迭代器遍历list,等待,直到Data中有数据
{
//取出数据处理
pInfo->R_LEN = *t;
int iiLen=(pInfo->R_LEN-sizeof(UINT32))/(sizeof(UINT32)*5);
if (iiLen*5+2>pInfo->Data.size()-pInfo->m_i)//判断数据包知否完整,不完整继续等待
{
break;
}
t = pInfo->Data.erase(t);
pInfo->R_CMD = *t;
t = pInfo->Data.erase(t);
pInfo->m_i+=iiLen*5+2;
for(int k=0;k<iiLen;k++)
{
pInfo->R_Mode = *t;
t = pInfo->Data.erase(t);
pInfo->R_Sum = *t;
t = pInfo->Data.erase(t);
pInfo->R_Vz = *t;
t = pInfo->Data.erase(t);
pInfo->R_Updown = *t;
t = pInfo->Data.erase(t);
pInfo->R_Leftright = *t;
t = pInfo->Data.erase(t);
}
}
}
return 0;
}
在开始处理的时候正常运行,运行一段时间之后会出错:list iterator not dereferenceable
请大家帮忙看看,谢谢!
------解决思路----------------------
多线程访问同一个list?加锁了吗?
------解决思路----------------------
mutex或cirticalsection
------解决思路----------------------
iterator 会错误
你用 了iterator以后,只能自己保证 iterator 没问题
因为你在 频频使用删除操作
这个操作通常会使 iterator 失效
大家好:
我最近在写一个DSP与上位机数据传输的MFC程序,使用Socket套接字。
在MFC程序中,主线程负责接收数据,接收到的数据按4字节转化为UINT32类型存进一个STL list双向链表中,同时开启一个子线程,负责从list中取出数据进行处理(子线程开启的更早,一直在等待)。
主线程部分很简单,只是把数据放进链表
list<UINT32> Data;
UINT32 sslen;
Data.push_back(sslen);
子线程负责从list中取出数据进行处理,它开启的更早,一直在等待,Data中有数据才处理,并且取出一个数据之后马上将这个数据从链表中删除;
UINT ThreadFunc(LPVOID pParm)//线程函数的定义
{
CAFM_TestDlg *pInfo=(CAFM_TestDlg*)pParm;
list<UINT32>::iterator t;
while (1)//一直循环处理
{
int sslen;
t = pInfo->Data.begin();
while(t!=pInfo->Data.end())//使用迭代器遍历list,等待,直到Data中有数据
{
//取出数据处理
pInfo->R_LEN = *t;
int iiLen=(pInfo->R_LEN-sizeof(UINT32))/(sizeof(UINT32)*5);
if (iiLen*5+2>pInfo->Data.size()-pInfo->m_i)//判断数据包知否完整,不完整继续等待
{
break;
}
t = pInfo->Data.erase(t);
pInfo->R_CMD = *t;
t = pInfo->Data.erase(t);
pInfo->m_i+=iiLen*5+2;
for(int k=0;k<iiLen;k++)
{
pInfo->R_Mode = *t;
t = pInfo->Data.erase(t);
pInfo->R_Sum = *t;
t = pInfo->Data.erase(t);
pInfo->R_Vz = *t;
t = pInfo->Data.erase(t);
pInfo->R_Updown = *t;
t = pInfo->Data.erase(t);
pInfo->R_Leftright = *t;
t = pInfo->Data.erase(t);
}
}
}
return 0;
}
在开始处理的时候正常运行,运行一段时间之后会出错:list iterator not dereferenceable
请大家帮忙看看,谢谢!
------解决思路----------------------
多线程访问同一个list?加锁了吗?
------解决思路----------------------
mutex或cirticalsection
------解决思路----------------------
iterator 会错误
你用 了iterator以后,只能自己保证 iterator 没问题
因为你在 频频使用删除操作
这个操作通常会使 iterator 失效