gpt4 book ai didi

c++ - TBB 并发 vector 是否支持旧的 C 风格循环?

转载 作者:太空宇宙 更新时间:2023-11-04 08:22:37 25 4
gpt4 key购买 nike

所以一个tbb vector允许获取开始指针和长度(大小)。那么我们可以安全地假设我们可以在不加锁的情况下从 begin 迭代到 begin+length 吗?或者我们如何将指针内容传递给接受开始指针和长度的 C 风格函数?我们是否应该只在从 vector 中删除元素时提供锁并且并发增长是可以接受的?

现实生活中的问题:指向 zmqsockets 的指针的并发 vector 同时变大和变小。一个带有 zmq poll 的线程,提供 C 风格的迭代。

最佳答案

tbb::concurrent_vector<>不代表用于存储其元素的连续数组/内存区域。请关注Fragmentation文档中的部分:

Unlike a std::vector, a concurrent_vector never moves existing elements when it grows. The container allocates a series of contiguous arrays. ...

blog可视化 concurrent_vector 的结构如果您考虑到内存段是单独分配的,并且内存中的地址可能不连续:

concurrent_vector structure

所以,答案

how can we pass pointer contents to C style function that accepts begin pointer and length

是你不能这样做,因为不能保证所有元素的连续内存(除非你决定单独处理每个段)。

您可以使用迭代器或 [] 遍历 concurrent_vector与 C 风格的循环完全一样的运算符:

for(i = 0; i < conc_vec.size(); i++)
printf(" %d", conc_vec[i])

但是在同时增长 vector 的其他线程存在的情况下,只有当您知道已经构建了所有元素的 vector 的安全大小时,它才是安全的。可以通过额外的努力和使用 tbb::zero_allocator 来避免锁定。正如该博客中所建议的那样。

关于c++ - TBB 并发 vector 是否支持旧的 C 风格循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32783137/

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