Использование CList в многопоточной среде - PullRequest
1 голос
/ 12 июня 2009

Я использую CList в многопоточной среде, и у меня продолжают возникать проблемы с методом GetHead. У меня есть один поток, который добавляет данные в список, и другой поток, который читает и удаляет данные из списка. Вот часть чтения:

 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 0x00000000 {pNext = ??? pPrev = ??? данные = {...} } CList>>, ATL :: CStringT>> &> :: CNode *
  • pPrev 0x00000000 {pNext = ??? pPrev = ??? данные = {...} } CList>>, ATL :: CStringT>> &> :: CNode *
  • data "" TESTSETSE ATL :: CStringT>>

Ответы [ 3 ]

4 голосов
/ 12 июня 2009

У вас есть условие гонки между вставкой и получением значения. Добавьте блокировку, которая включает все тело get_next (), insert () и pop_next ().

2 голосов
/ 12 июня 2009

CList не является потокобезопасным - вам нужно использовать критические разделы вокруг тех фрагментов кода, которые проверяют состояние очереди, а затем что-то с этим делать.

Кроме того, почему у вас бит, который работает с элементом в очереди, отличается от потока, который удаляет элементы из очереди?

0 голосов
/ 12 июня 2009

Не пытайтесь делать вещи с GUI в потоке без GUI. Только один поток (как правило) является потоком GUI. Тема с сообщением насос. Другими словами основной поток.

Ваши рабочие потоки должны посылать некоторый сигнал основному потоку, который затем добавляет и удаляет элементы из списка.

...