我已将一个向量声明为
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
保护此列表。我仍然遇到了这个问题。你能建议和解决吗?这对我很有帮助。
答案 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上的一些类似工具)下运行你的程序来清除你的内存访问错误。