1

我在多线程环境中使用 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=??? 上一页=???数据={...} } CList > >,ATL::CStringT > > &>::CNode *
  • pPrev 0x00000000 {pNext=??? 上一页=???数据={...} } CList > >,ATL::CStringT > > &>::CNode *
  • 数据 "" TESTSETSE ATL::CStringT > >
4

3 回答 3

4

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

于 2009-06-12T19:22:53.887 回答
2

CList不是线程安全的——你需要在那些检查队列状态的代码周围使用关键部分,然后用它做一些事情。

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

于 2009-06-12T19:26:05.597 回答
0

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

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

于 2009-06-12T19:32:04.490 回答