gpt4 book ai didi

c++ - 在多线程环境中使用 CList

转载 作者:行者123 更新时间:2023-11-30 01:01:16 24 4
gpt4 key购买 nike

我在多线程环境中使用 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 *
  • data "" TESTSETSE ATL::CStringT > >

最佳答案

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

关于c++ - 在多线程环境中使用 CList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/988538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com