gpt4 book ai didi

c++ - 迭代不断变化的容器

转载 作者:可可西里 更新时间:2023-11-01 16:37:04 25 4
gpt4 key购买 nike

我正在迭代一组回调函数。函数在迭代期间被调用,可能会导致函数集的实际容器发生剧烈变化。

我现在做的是:

  1. 制作原始集的拷贝
  2. 遍历拷贝,但对于每个元素检查它是否仍然存在于原始集合中

检查每个元素的存在是 super 动态的,但看起来也很慢。

是否有其他建议来解决这个问题?

编辑:这里是实际的代码:

    // => i = event id
template <class Param>
void dispatchEvent(int i, Param param) {

EventReceiverSet processingNow;

const EventReceiverSet& eventReceiverSet = eventReceiverSets[i];
std::copy(eventReceiverSet.begin(), eventReceiverSet.end(), std::inserter(processingNow, processingNow.begin()));

while (!processingNow.empty()) {
EventReceiverSet::iterator it = processingNow.begin();
IFunction<>* function = it->getIFunction(); /// get function before removing iterator
processingNow.erase(it);

// is EventReceiver still valid? (may have been removed from original set)
if (eventReceiverSet.find(ERWrapper(function)) == eventReceiverSet.end()) continue; // not found

function->call(param);
}
};

最佳答案

我想到了两种基本方法:

  1. 使用基于任务的方法(在集合锁定的情况下,将任务推送到每个元素的队列中,然后释放所有参与方的工作并等待完成)。当任务实际开始时,您仍然需要检查当前任务的元素是否仍然存在/当前在集合中。

    • 这可以利用读写锁进行检查,这通常比全面的互斥更快(尤其是当读者多于作者时)

  2. 使用并发数据结构(我的意思是,一种适用于没有显式锁定的多线程访问的数据结构)。以下库包含并发数据结构的实现:

(稍后添加链接)

关于c++ - 迭代不断变化的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9165667/

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