다중 스레드 환경에서 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>>
std :: deque로 전환했을 때, 기능이 정상적으로 작동합니다 (즉, IsEmpty()를 empty()로 변경해야만합니다.) CList가 std :: deque는? – Drahakar
std :: deque는 스레드로부터 안전하지 않습니다. std :: deque로 충돌을 일으키지 않았다는 사실은 std :: deque와 CList의 근본적인 차이가 아니라 행운 때문입니다. 언제나처럼 무언가가 효과가있는 것 같아서, 그것이 옳다는 것을 의미하지는 않습니다 ... – DavidK
@DavidK "뭔가가 효과가있는 것 같아서, 그것이 옳다는 것을 의미하지는 않습니다."- 나는 그것을 내 벽에 담을 것입니다. :) –