【发布时间】:2013-04-10 04:21:40
【问题描述】:
目前在我的项目中,我有两个静态方法PushObjects 和ProcessObject。 PushObject 方法将数据推回静态双端队列,该方法可以由多个线程访问,但 ProcessObject 始终由单个线程使用,用于从顶部检索对象并删除它们。现在我的问题是无论我尝试什么,我最终总是(迟早会收到deque iterator not dereferencable 错误。任何关于我可以做些什么来阻止这个问题的建议。下面给出了我的PushObjects 和ProcessObject 的摘要
void foo::PushObjects(obj A)
{
try
{
{//Begin Lock
boost::lock_guard<boost::mutex> lock(mutex_push);
mydeque.push_back(A);
}//End Lock
condition_read.notify_one(); //Inform the reader that it could start reading
}
catch (std::exception& e)
{
__debugbreak();
}
}
This is the static Reader method
void foo::ProcessObject()
{
{//Begin Lock
boost::unique_lock<boost::mutex> lock(mutex_process);
while(true)
{
while(mydeque.empty()) { condition_read.wait(lock); }
try
{
if(!mydeque.empty())
{
obj a = mydeque.front();
......Process the object........
mydeque.pop_front();
}
}
catch (std::exception& e)
{
__debugbreak();
}
}//end while
}//End lock
}
据我所知,一旦从双端队列中添加或删除项目,迭代器就会变得无效。有没有办法解决这个问题。
【问题讨论】:
-
boost::mutex::scoped_lock lock(lock);显然是错误的。如果您删除它,并取消注释上面行中更合理的锁定声明,您仍然有问题吗? -
Re "iterators become invalid": 没错,但是你这里没有使用任何迭代器,所以这不是问题。
-
好的,但是你的真实代码是否锁定
mutex_push(就像注释掉的行一样),或者它是否在没有触及mutex_push的情况下错误地从自身初始化lock(作为你的代码)已经发布了)? -
仅供参考,
if(!mydeque.empty())是不需要的,除非你有代码在修改你的双端队列而不锁定你的双端队列互斥锁(如果你这样做,那就是你没有做对的线索) .看代码。为什么你刚刚打破了监视 cond-var 的while()循环?嗯...此外,方便省略的超级机密代码是否仅称为......Process the object........曾经解锁双端队列锁?请发布真实代码。