concurrent_vector 迭代器的算术:假设从迭代器中减去“begin ()”会给出索引是不是安全?
Posted
技术标签:
【中文标题】concurrent_vector 迭代器的算术:假设从迭代器中减去“begin ()”会给出索引是不是安全?【英文标题】:Arithmetic with concurrent_vector iterators: is it safe to assume that subtracting 'begin ()' from an iterator will give the index?concurrent_vector 迭代器的算术:假设从迭代器中减去“begin ()”会给出索引是否安全? 【发布时间】:2013-05-01 11:12:49 【问题描述】:由于 concurrent_vector 不使用连续的内存块,我想确定这是否可以:
concurrency::concurrent_vector<Something> my_array;
//Populate 'm_array' somehow perhaps involving multiple threads
const auto iter = std::find_if (my_array.begin (), m_array.end (), SomeLambda);
const int index = iter - my_array.begin ();
我的问题:在任何情况下,'index' 不会索引我刚刚找到的元素(通过 concurrect_vector::operator[] 方法)?我意识到另一个线程理论上可以修改元素 - 这不是我的问题。
我想这应该可行,但是因为我习惯于使用原始指针,所以我想问一下(这样我就不会无意中添加细微错误的来源)。
【问题讨论】:
那么concurent_vector
是什么?
msdn.microsoft.com/en-us/library/ee355343.aspx ?
它有一个difference_type
,并且文档说它是一个随机访问迭代器,所以假设MS是理智的并且遵循The Standard meaning of that phrase,这是安全的。
感谢@BoBTFish。这是一个有用的参考。
Microsoft 的 concurrent_vector
源自 tbb 的 concurrent_vector
。如果您需要将代码移植到 Windows 以外的地方,您几乎可以直接将 tbb 实现直接放入其中:threadingbuildingblocks.org/docs/help/reference/…
【参考方案1】:
concurrent_vector::iterator
是一个随机访问迭代器,因此支持并有效地取差(尽管您不应该使用int
来存储结果)。
当然,正如您所说,这不是线程安全的。
【讨论】:
谢谢@Joe。我将根据这个答案继续编写我的代码。也感谢您修改问题 - 我没有意识到 concurrent_vector 是 Microsoft 特定的,但这仍然很好,因为我只在 Visual Studio 中编写代码。 @Coder_Dan 它似乎并没有给std::vector
增加很多东西。如果你想要可移植的代码,你可以很容易地编写这个功能。话虽如此,其他人可能已经这样做了。【参考方案2】:
它是安全的,但为什么不使用std::distance
呢?
【讨论】:
谢谢@Alex。我是 STL 的新手,之前没有遇到过 std::distance。以上是关于concurrent_vector 迭代器的算术:假设从迭代器中减去“begin ()”会给出索引是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章