несколько потоков с векторным итератором - PullRequest
4 голосов
/ 06 июля 2011

Я объявил вектор как

typedef std :: vector SampleList;

и объявлена ​​переменная-член типа Samplist в классе.

Я обращаюсь к этому вектору из другого класса с несколькими потоками.

Я добавляю, удаляю, читаюзначения значений из разных потоков.Я часто читаю это значение, как показано ниже.

SampleList* listSample;
listSample= ptr->GetList();
while(true)
{   
    SampleList::iterator itrSample;
    itrSample = listSample->begin();

    unsigned int nId = 0;


    for ( ; itrSample < listRoundRobinSensor->end(); ++itrSample )
    {           
         nId =(unsigned int) *itrSample ;
    }

}

Значение для itrSample становится ненужным, например 4261281277 .

Я пытался защитить этот список с помощью critical secion.Тем не менее, я получил эту проблему.Можете ли вы предложить и решение.Это будет очень полезно для меня.

Ответы [ 3 ]

4 голосов
/ 06 июля 2011

Можете ли вы показать нам, как вы делаете свои критические разделы?Поскольку Mutex определенно может решить вашу проблему

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

, если вы делаете:

  ...
  {
    for ( ; itrSample < listRoundRobinSensor->end(); ++itrSample )
    {        
      MutexLocker m(mutex);   
      nId =(unsigned int) *itrSample ;
      // Do horrible stuff like insertion/deletion
    } // m dies at the end of the scope (cf RAII)
  } 

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

Решение будет следующим:

  ...
  {
    MutexLocker m(mutex);   
    for ( ; itrSample < listRoundRobinSensor->end(); ++itrSample )
    {   
      nId =(unsigned int) *itrSample ;
      // Do horrible stuff like insertion/deletion
    } 
  } // m dies at the end of the scope (cf RAII)
3 голосов
/ 06 июля 2011

Как только кто-то добавляет или удаляет элемент вектора, ваш итератор становится недействительным.

Особенно, если добавляются элементы, возможно, потребуется перераспределить внутренний буфер. Но также, если объекты удалены, end () движется, и вы можете пропустить его.

У вас должна быть блокировка для защиты вектора во время итерации по нему.

1 голос
/ 06 июля 2011

4261281277 - это 0xFDFDFDFD, который, возможно, является неинициализированной областью памяти на вашей платформе.Я бы попробовал запустить вашу программу под valgrind (или подобным инструментом в Windows), чтобы избавиться от ошибок доступа к памяти.

...