【问题标题】:modifying element of fixed size tbb concurrent vector修改固定大小 tbb 并发向量的元素
【发布时间】: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


    【解决方案1】:

    根据代码,您只修改向量的元素,而不是向量。如果是这样,迭代器不会失效。通过 operator[] 访问期间没有什么特别的,其中没有隐藏的锁。因此,当仅更新 my_struct 的一部分时,t4 可能会看到旧值、新值或介于两者之间的值。

    【讨论】:

      猜你喜欢
      • 2018-12-18
      • 2020-04-12
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      相关资源
      最近更新 更多