2009-06-12 13 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(); 
      } 
     } 

です。 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>>

答えて

4

あなたはレースを持っています値の挿入と取り出しの間の条件。 get_next()、insert()、およびpop_next()の本体全体を含むロックを追加します。

+0

私はstd :: dequeに切り替えると、それは本当にうまく動作します、私は関数(すなわち、IsEmpty()をempty()に変更する必要があります。デュークは? – Drahakar

+1

std :: dequeはスレッドセーフではありません - std :: dequeでクラッシュしていないという事実は、std :: dequeとCListの基本的な違いではなく、運が原因です。今までどおり、何かがうまくいくと思うので、それは正しいことを意味するわけではありません。 – DavidK

+0

@DavidK「何かがうまくいくと思われるから、それが正しいとは限りません」 - 私はそれを私の壁に置きます:) –

2

CListはスレッドセーフではありません - キューのステータスをチェックしてから何かを行うコードの周りにクリティカルセクションを使用する必要があります。

また、キューのアイテムで動作するビットが、キューからアイテムを削除するビットとは異なるスレッドを持っているのはなぜですか?

0

GUI以外のスレッドでGUIを実行しようとしないでください。 1つのスレッド(通常は)のみがGUIスレッドです。メッセージポンプを備えたスレッド。言い換えれば、メインスレッド。

ワーカースレッドはメインスレッドに何らかの信号を送信し、&はリストボックスから項目を削除します。

関連する問題