マルチスレッド環境でCListを使用していますが、GetHeadメソッドに問題があります。私は、リストにデータを追加するスレッドと、リストからデータを読み込んで削除するスレッドを持っています。ここ は読取部である。ここではマルチスレッド環境でのCListの使用
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();
}
}
です。 m_pNodeHead値ではあるが
template<class TYPE, class ARG_TYPE>
AFX_INLINE TYPE& CList<TYPE, ARG_TYPE>::GetHead()
{ ENSURE(m_pNodeHead != NULL);
return m_pNodeHead->data; }
:それは常にこの主張で
t = queue.GetHead();
で失敗
- pNextの0x00000000の{pNext = ??? pPrev = ???データ:{...} } CList >>、ATL :: CStringT >> &> :: CNode *
- pPrev 0x00000000 {pNext = ??? pPrev = ???データ= {...}} CListの>>、ATL :: CStringT>> &> :: Cノード*
- データ "" TESTSETSE ATL :: CStringT>>
私はstd :: dequeに切り替えると、それは本当にうまく動作します、私は関数(すなわち、IsEmpty()をempty()に変更する必要があります。デュークは? – Drahakar
std :: dequeはスレッドセーフではありません - std :: dequeでクラッシュしていないという事実は、std :: dequeとCListの基本的な違いではなく、運が原因です。今までどおり、何かがうまくいくと思うので、それは正しいことを意味するわけではありません。 – DavidK
@DavidK「何かがうまくいくと思われるから、それが正しいとは限りません」 - 私はそれを私の壁に置きます:) –