在多线程环境中使用CList

时间:2009-06-12 19:19:12

标签: c++ winapi mfc atl

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

 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 0x00000000 {pNext = ??? pPrev = ???数据= {...}   } CList&gt; &gt;,ATL :: CStringT&gt; &GT; &amp;&gt; :: CNode *
  •   
  • pPrev 0x00000000 {pNext = ??? pPrev = ???数据= {...}   } CList&gt; &gt;,ATL :: CStringT&gt; &GT; &amp;&gt; :: CNode *
  •   
  • data“”TESTSETSE ATL :: CStringT&gt; &GT;
  •   

3 个答案:

答案 0 :(得分:4)

插入和检索值之间存在竞争条件。添加一个包含整个get_next(),insert()和pop_next()的锁。

答案 1 :(得分:2)

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

另外,为什么有一个与队列中的项目一起使用的位与从队列中删除项目的位不同?

答案 2 :(得分:0)

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

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