使用Vector迭代器的多个线程
multiple threads with Vector iterator
我已经将向量声明为
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上的一些类似工具(下运行你的程序,以清除你的内存访问错误。
相关文章:
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- std::vector::clear()ing 二维向量线程的内部向量安全吗?
- 使用 vector<thread> 和 .join() 未并行运行的多线程C++程序
- 必须将 std::thread 加入 std::vector<std::thread> 两次以避免从线程 dtor 终止
- 将分配到std :: vector元素线程安全
- 编写std::vector与普通数组的线程安全性
- Seg 由对 vector (线程 linux) push_back调用而导致的错误
- 在 std::vector 上运行的多个线程:在这种情况下我需要锁定吗?
- 从多个线程访问和使用std::vector
- QList、QVector或std::vector多线程使用
- 可以用C++std::vector同时处理来自多线程的push_back
- std::vector::erase() (多线程) '断言 'px != 0' 失败。
- c++中带有std::Vector的多线程
- c++使用' .reserve() '填充' std::vector '作为防止多线程缓存无效和错误共享的一种方
- 在多线程C++程序中使用std::vector时导致应用程序崩溃
- 多线程程序,它将线程保存在vector而不是数组中
- 我可以制作一个线程安全的 std::atomic<vector<int>>吗?
- 在c++中向线程函数传递vector
- std::map和std::vector线程安全吗?