【发布时间】:2020-09-25 21:42:41
【问题描述】:
我的应用程序有 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 只包含整数,并且向量是固定大小的。
【问题讨论】:
标签: c++ multithreading tbb