【发布时间】:2014-04-16 17:37:09
【问题描述】:
我有一个container<std::deque<T>> 和一个const T*ptr,我知道它们指向包含的deques 之一中的一个对象。现在,我想知道(1)它来自哪个deque,以及(2)它在那个中的索引。如何获取这些信息?
我知道我可以遍历所有对象,但应该有更快的解决方案,不是吗?
【问题讨论】:
-
我不知道您是如何进入那个角落的,但最好的解决方案很可能是重构原始问题以避免这种情况。这里有几个危险信号,例如,
deque中间的插入或删除可以更改您的指针所指的对象(概念上使用 对象 作为保存您的值的对象期待) -
@DavidRodríguez-dribeas 我使用
deques 作为临时对象的线程本地分配器。我最后只emplace()他们,因此永远不会使任何以前的指针无效。 -
...由于某种原因您不知道哪个线程分配了对象?这是否意味着不同的线程可能正在尝试解除分配/作用于对象,因此该对象实际上是 shared 而不是 thread-local(概念上)?如果您确实知道线程,那么您应该知道
deque中的哪个持有该值,对吧? -
对象是线程本地分配和使用的,但在算法的另一个阶段,它们是共享的。他们的寿命与
container<std::deque<T>>一样长。container本质上是map<thread::id,std::deque<T>>的(线程安全版本)。 -
如果稍后不同的线程访问同一个对象,那么您不能认为
deque是线程本地的。考虑动态创建对象并传递指针的所有权。这样deque的使用将由单个线程访问。否则,您将始终有多个线程访问相同的deque数据结构。