使用Vector迭代器的多个线程

multiple threads with Vector iterator

本文关键字:线程 Vector 迭代器 使用      更新时间:2023-10-16

我已经将向量声明为

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的值变为垃圾值,如42612827

我试着用critical secion来保护这个列表。我还是有这个问题。你能提出建议和解决方案吗。这对我很有帮助。

一旦有人添加或删除向量的成员,迭代器就会失效。

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

在对向量进行迭代时,必须有一个锁来保护它。

你能告诉我们你是如何完成关键部分的吗?因为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)
  } 

然后,这会导致并发错误。CCD_ 2变为无效。

一个解决方案是:

  ...
  {
    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)

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