2009-06-12 86 views
1

我在多線程環境中使用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(); 
      } 
     } 

爲什麼我得到一個運行時錯誤,當我運行這個。它總是在

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 00000000 {pNext = ??? pPrev = ??? data = {...} } CList>>,ATL :: CStringT>> &> :: CNode *
  • pPrev 0x00000000 {pNext = ??? pPrev = ???數據= {...}} 欄列表>>,ATL :: CStringT>> &> :: CNode *
  • 數據 「」 TESTSETSE ATL :: CStringT>>

回答

4

你有一場比賽插入和檢索值之間的條件。添加一個包含get_next(),insert()和pop_next()的整個主體的鎖。

+0

什麼錯誤的是,當我切換到std :: deque,它的工作真的很好,我只需要改變函數(即IsEmpty()爲空())。爲什麼不會CList工作在哪裏std ::德克呢? – Drahakar 2009-06-13 00:46:53

2

CList不是線程安全的 - 您需要在檢查隊列狀態的代碼位周圍使用關鍵部分,然後對其執行某些操作。

另外,爲什麼你有一個與隊列上的項目不同的線程,而不是從隊列中刪除項目的位?

0

不要嘗試在非GUI線程中執行GUI。只有一個線程(通常)是GUI線程。帶消息泵的線程。換句話說,主線程。

您的工作線程應該向主線程發送某種信號,然後添加&從列表框中刪除項目。