繁体   English   中英

在多线程环境中使用CList

[英]Using CList in a multithreaded environment

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

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

CList不是线程安全的-您需要在代码的那些关键部分使用关键部分来检查队列的状态,然后对其进行处理。

另外,为什么与队列中用于删除项目的位相比,与队列中的项目使用不同的位?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM