2009-06-12 120 views
1

我在多线程环境中使用CList,并且一直存在GetHead方法的问题。我有一个线程将数据添加到列表中,另一个线程从列表中读取和删除数据。 这里是阅读部分:在多线程环境中使用CList

value_type get_next() 
     { 
      T t; 
      if(!queue.IsEmpty()) { 
      t = queue.GetHead(); 
      } 
      return t; //If the queue is empty we return an empty element 
     } 

这里是插入部分:

inline void insert(T &_in) 
     { 
      queue.AddTail(_in); 
     } 

这里是去除部

inline void pop_next() 
     { 
      if(!queue.IsEmpty()) { 
      queue.RemoveHead(); 
      } 
     } 

为什么我得到一个运行时错误,当我运行这个。它总是在

t = queue.GetHead(); 

失败有了这个断言:

template<class TYPE, class ARG_TYPE> 
AFX_INLINE TYPE& CList<TYPE, ARG_TYPE>::GetHead() 
    { ENSURE(m_pNodeHead != NULL); 
     return m_pNodeHead->data; } 

虽然m_pNodeHead值为:

  • pNext 00000000 {pNext = ??? pPrev = ??? data = {...} } CList>>,ATL :: CStringT>> &> :: CNode *
  • pPrev 0x00000000 {pNext = ??? pPrev = ???数据= {...}} 栏列表>>,ATL :: CStringT>> &> :: CNode *
  • 数据 “” TESTSETSE ATL :: CStringT>>

回答

4

你有一场比赛插入和检索值之间的条件。添加一个包含get_next(),insert()和pop_next()的整个主体的锁。

+0

什么错误的是,当我切换到std :: deque,它的工作真的很好,我只需要改变函数(即IsEmpty()为空())。为什么不会CList工作在哪里std ::德克呢? – Drahakar 2009-06-13 00:46:53

2

CList不是线程安全的 - 您需要在检查队列状态的代码位周围使用关键部分,然后对其执行某些操作。

另外,为什么你有一个与队列上的项目不同的线程,而不是从队列中删除项目的位?

0

不要尝试在非GUI线程中执行GUI。只有一个线程(通常)是GUI线程。带消息泵的线程。换句话说,主线程。

您的工作线程应该向主线程发送某种信号,然后添加&从列表框中删除项目。