修改固定大小tbb并发向量的元素
modifying element of fixed size tbb concurrent vector
我的应用程序有6个线程,它们共享一个公共的tbb::concurrent_vector
、t1、t2和t3。它们是遍历向量、调用tbb::concurrent_vector< T, A >::operator[](size_type index)
并修改该特定索引处的引用的编写器。线程t4、t5、t6是周期性地遍历向量、读取每个索引处的值并对其执行操作的读取器。
例如t1、t2、t3:
for (size_t i = 0; i < my_vec.size(); ++i)
{
my_struct& item = my_vec[i];
if (i%2 == 0)
{
item.prop = some_other_var * item.prop;
}
else
{
my_struct item2{item.prop**2, some_other_var};
my_vec[i] = item2;
}
}
以及t4、t5、t6
for (const my_struct* p = my_vec.cbegin(); p != my_vec.cend(); ++p)
{
std::cout << "thread no=" << t << ", prop=" << p->prop << std::endl;
}
我的问题是,如果t1修改向量,而t4正在遍历所有元素,迭代器会发生什么?迭代器是否失效?如果不是,t4预计会看到什么值,更新后的值还是更新前的值?
struct my_struct只包含整数,并且向量大小固定。
根据代码,您只修改vector的元素,而不修改vector。如果是这样,迭代器就不会失效。通过运算符[]访问时没有什么特别的东西,也没有隐藏的锁。因此,当只更新my_struct
的一部分时,t4可能会看到旧值、新值或介于两者之间的东西。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 使用异步/期货并行和并发计算向量的范数
- C++ 从并发向量中删除元素
- TBB并发向量与STL并发向量的区别
- 使用自定义容器并发向量更改提升图邻接列表中的容器生成器