使用Vector迭代器的多个线程

时间:2011-07-06 12:07:48

标签: c++ multithreading stdvector

我已将一个向量声明为

  

typedef std :: vector< unsigned int> 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 个答案:

答案 0 :(得分:4)

您能告诉我们您的关键部分吗?因为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)

答案 1 :(得分:3)

只要有人添加或删除了向量的成员,迭代器就会变为无效。

特别是如果添加了元素,则可能必须重新分配内部缓冲区。但是如果删除了对象,则end()正在移动,你可能会错过它。

你必须有一个锁来保护矢量,同时迭代它。

答案 2 :(得分:1)

4261281277是0xFDFDFDFD,它可能是您平台上未初始化的内存区域。我尝试在valgrind(或Windows上的一些类似工具)下运行你的程序来清除你的内存访问错误。