gpt4 book ai didi

c++ - 如何在 std::deque 中避免 `deque iterator not dereferencable`?锁?

转载 作者:太空狗 更新时间:2023-10-29 23:33:22 46 4
gpt4 key购买 nike

目前在我的项目中我有两个静态方法PushObjectsProcessObjectPushObject 方法将数据推回静态双端队列,此方法可由多个线程访问,但 ProcessObject 始终由单个线程使用,并用于从中检索对象顶部并删除它们。现在我的问题是无论我尝试什么我总是最终(迟早会得到一个 deque iterator not dereferencable 错误。关于我可以做些什么来阻止这个问题的任何建议。一个下面给出了我的 PushObjectsProcessObject 的摘要

    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
}

据我了解,一旦在双端队列中添加或删除项目,迭代器就会变得无效。有没有办法解决这个问题。

最佳答案

看起来您没有使用相同的互斥锁(mutex_pushmutex_process)来读取和写入 deque。你需要成为。在不同线程上同时写入和读取内存是不安全的。

其他说明:

obj a = mydeque.front();
......Process the object........
mydeque.pop_front();

如果您管理您的锁以拥有最短的锁定时间,可能会好得多...

obj a = std::move(mydeque.front());
mydeque.pop_front();
lock.unlock();
// process the object
lock.lock();

您可能不需要被锁定(或者至少不需要相同的锁)来处理该对象。这样你的作者仍然可以在你处理的时候写信给双端队列。还要注意的是,这里没有什么能阻止您成为多生产者多消费者,而不仅仅是多生产者单一消费者。

关于c++ - 如何在 std::deque 中避免 `deque iterator not dereferencable`?锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16059469/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com