修改固定大小tbb并发向量的元素

modifying element of fixed size tbb concurrent vector

本文关键字:并发 向量 元素 tbb 修改      更新时间:2024-05-09

我的应用程序有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可能会看到旧值、新值或介于两者之间的东西。