[英]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.