#define MAX_LEN 16
struct B
{
TCHAR wszA[MAX_LEN];
DWORD dwD;
};class A
{
public:
bool GetANode(TCHAR *pwszA,struct B &b,list<struct B>::iterator &pit);
bool AddANodeTail(struct B &b);
bool AddANodeHead(struct B &b);
bool DeleteANode(TCHAR *pwszA);
private:
list<struct B> m_list;
};bool A::AddANodeTail(struct B &b)
{
list<struct B>::iterator it=m_list.begin();
while(it != m_list.end())
{
if( wcscmp(it->wszA,b.wszA) == 0)
break;
++it;
}
if(it != m_list.end())
return false;
//m_list.insert(m_list.end(),b);
m_list.push_back(b); return true;
}bool A::AddANodeHead(struct B &b)
{
list<struct B>::iterator it=m_list.begin();
while(it != m_list.end())
{
if( wcscmp(it->wszA,b.wszA) == 0)
break;
++it;
}
if(it != m_list.end())
return false;
//m_list.insert(m_list.begin(),b);
m_list.push_front(b); return true;
}bool A::DeleteANode(TCHAR *pwszA)
{
list<struct B>::iterator it=m_list.begin();
while(it != m_list.end())
{
if( wcscmp(it->wszA,pwszA) == 0)
break;
++it;
}
if(it == m_list.end())
return false;
m_list.erase(it);
return true;
}bool A::GetANode(TCHAR *pwszA, B &b, list<struct B>::iterator &pit)
{
list<struct B>::iterator it=m_list.begin();
while(it != m_list.end())
{
if( wcscmp(it->wszA,pwszA) == 0)
break;
++it;
}
if(it == m_list.end())
return false;
b.dwD=it->dwD;
wcscpy_s(b.wszA,MAX_LEN,it->wszA);
pit=it; return true;
}
unsigned int __stdcall ThreadProc(LPVOID lpParam)
{
//...
g_obj.DeleteANode(L"123");
//...
return 0;
}
A g_obj;
int main()
{
HANDLE hThread=(HANDLE)::_beginthreadex(NULL,0,ThreadProc,0,0,NULL);
B b;
wcscpy_s(b.wszA,MAX_LEN,L"123");
b.dwD=123;
g_obj.AddANodeHead(b); B tmp;
list<B>::iterator it;
if( !g_obj.GetANode(L"123",tmp,it))
{
return 0;
}
// ... 做了一些工作,花了有点长的时间 wcscpy_s(it->wszA,MAX_LEN,L"456"); //异常了 list iterator is not reference
it->dwD=456;
return 0;
}
我的问题:主线程创建了一个辅助线程,2个线程公用一个 变量 g_obj;
主线程里保存了一个指向list里的一个元素的迭代器,然后主线程 “做了一些工作,花了有点长的时间”,
辅助线程里在这个时候删除了这个元素,导致主线程里的迭代器失效了。
程序崩溃了。有什么办法处理这样的情况吗?
list 的迭代器还是比较安全的,插入一个元素,删除一个不是已经指向了的迭代器的元素都没问题。
建议你赶紧找个像样的list外加一个CS保护下吧,别浪费时间了。