#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 的迭代器还是比较安全的,插入一个元素,删除一个不是已经指向了的迭代器的元素都没问题。

解决方案 »

  1.   

    list中删除元素时,除了指向当前被删除元素的迭代器外,其它迭代器都不会失效
      

  2.   

    两个线程操作同一个list, 要加锁 (如临界区)
      

  3.   

    你这个问题不能碰运气啊,多线程资源共享并且是改写操作,不加锁天才也不行啊!
    建议你赶紧找个像样的list外加一个CS保护下吧,别浪费时间了。
      

  4.   

    Get函数不要直接返回迭代器,把迭代器付给一个该类型的指针返回。
      

  5.   

    用了STL,还有必要自己再封一层么,多此一举,你这几个队首队尾操作STL全有,该加的互斥操作却没加
      

  6.   

    你这个就是典型的没做好同步导致的应该是你主线程和辅助线程都对list进行了增删之类的操作注意修改的时候要加锁,用个临界对象来保护list