2009-06-12 7 views
1

다중 스레드 환경에서 CList를 사용하고 있는데 GetHead 메소드에 계속 문제점이 있습니다. 목록에 데이터를 추가하는 하나의 스레드와 목록에서 데이터를 읽고 제거하는 다른 스레드가 있습니다. 나는이 프로그램을 실행할 때 나는 런타임 오류가 이유는 무엇입니까다중 스레드 환경에서 CList 사용

다음
inline void insert(T &_in) 
     { 
      queue.AddTail(_in); 
     } 

가 제거 부분

inline void pop_next() 
     { 
      if(!queue.IsEmpty()) { 
      queue.RemoveHead(); 
      } 
     } 

입니다 :

여기
value_type get_next() 
     { 
      T t; 
      if(!queue.IsEmpty()) { 
      t = queue.GetHead(); 
      } 
      return t; //If the queue is empty we return an empty element 
     } 

가 삽입 부분 : 여기 는 읽기 부분입니다 . 항상이 어설 션

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 = ??? 데이터 = {...} } CList>>, ATL :: CStringT>> &> :: CNode *
  • pPrev 0x00000000 {pNext = ??? pPrev = ??? 데이터 = {...} } CLIST>>, ATL :: CStringT>> &> :: CNode *
  • 데이터가 ""TESTSETSE의 ATL :: CStringT>>

답변

4

당신은이 경주 값을 삽입하고 검색하는 사이의 조건. get_next(), insert() 및 pop_next()의 전체 본문을 포함하는 잠금을 추가하십시오.

+0

std :: deque로 전환했을 때, 기능이 정상적으로 작동합니다 (즉, IsEmpty()를 empty()로 변경해야만합니다.) CList가 std :: deque는? – Drahakar

+1

std :: deque는 스레드로부터 안전하지 않습니다. std :: deque로 충돌을 일으키지 않았다는 사실은 std :: deque와 CList의 근본적인 차이가 아니라 행운 때문입니다. 언제나처럼 무언가가 효과가있는 것 같아서, 그것이 옳다는 것을 의미하지는 않습니다 ... – DavidK

+0

@DavidK "뭔가가 효과가있는 것 같아서, 그것이 옳다는 것을 의미하지는 않습니다."- 나는 그것을 내 벽에 담을 것입니다. :) –

2

CList은 스레드 안전하지 않습니다. 큐 상태를 확인하는 코드 비트 주위에 중요한 섹션을 사용해야합니다.

또한 큐의 항목과 함께 큐에서 항목을 제거하는 비트와 다른 스레드가 작동하는 이유는 무엇입니까?

0

GUI가 아닌 스레드에서 GUI 작업을 시도하지 마십시오. 하나의 스레드 (일반적으로) 만 GUI 스레드입니다. 메시지 펌프가있는 스레드. 즉, 메인 스레드.

작업자 스레드는 주 스레드에 어떤 종류의 신호를 보내야하며, &은 목록 상자에서 항목을 제거합니다.

관련 문제