【发布时间】:2016-03-25 21:16:51
【问题描述】:
在我的多线程应用程序中,我有两个线程使用相同的std::deque。其中一个写入它,而另一个读取它(用于数据分析)。
我收到此错误:
Deque 迭代器不可取消引用
编辑:
这是我用于从双端队列读取的代码。该错误在 if 条件的某个更深的地方引发(我正在使用 at 访问双端队列)。
for (int i = 0; i <myDeque.size(); i++){
try{
if (myDeque.at(i) > 10){
//do stufff
}
}
catch (...){
cout << "ERROR" << endl;
}
}
我认为,这是由于双端队列的这种多线程访问而发生的。
我无法通过 try-catch 块捕获错误。我不能这样做吗,因为它被扔进了一个更深的“平面”?
有没有可能修复这个错误?
【问题讨论】:
-
deque是空的吗? -
您是否使用任何同步机制(例如锁或互斥锁)来序列化对出队对象的访问?如果没有,你应该;当您希望多个线程能够访问共享数据结构时,这是标准解决方案。
-
assert(!d.empty());在您取消引用之前。 -
虽然您可能会遇到数据竞争,除非您也有某种同步机制,但您的问题是您使用的是无效的迭代器。如果您的一个线程正在写入双端队列,而另一个仍在遍历它,则您的迭代器将失效。
-
@ShadowRanger en.cppreference.com/w/cpp/container/deque/emplace_back 表示
emplace_back()使所有迭代器无效,push_back()和push_front()也是如此。我是不是误解了什么?
标签: c++ multithreading