我在多线程环境中使用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值是:
发布于 2009-06-12 19:22:53
在插入和检索值之间有一个竞争条件。添加一个包含整个get_next()、insert()和pop_next()主体的锁。
发布于 2009-06-12 19:26:05
CList并不是线程安全的--您需要在那些检查队列状态的代码周围使用关键部分,然后对其执行一些操作。
另外,为什么要使用与队列中的项(与从队列中删除项的位不同的线程)工作的位?
发布于 2009-06-12 19:32:04
不要试图在非GUI线程中执行GUI内容。只有一个线程(通常)是GUI线程。带有消息泵的线程。换句话说,主线程。
您的工作线程应该向主线程发送某种信号,然后主线程从列表框中添加和删除项。
https://stackoverflow.com/questions/988538
复制相似问题