繁体   English   中英

在线程上的2D向量上push_back是否安全?

[英]It is safe to push_back on a 2D vector on threads?

可以说我有一个2D数组和这个函数:

void addVec(std::vector<std::vector<short> >& arr, size_t idx){ 
   arr[idx].push_back(idx);
}

std::vector<std::vector<short> > arr(2);
boost::threads th1(addVec, boost::ref(arr), 0);
boost::threads th2(addVec, booost::ref(arr), 1);
th1.join();
th2.join();

现在,我应该有arr [0] [0] = 0; 并且arr [1] [0] = 1; 问题是这是否安全? 在内部,线程应将值添加到向量存储器的不同部分,并且由于它是在大小2的开头构造的,因此仅内部向量会被调整大小,因此线程具有独占访问权限。

这应该是安全的,因为每个线程都访问一个单独的向量。 但是,如果您做任何可能导致arr调整大小的操作,那么所有投注都将关闭...

我建议您退后一步,考虑自己的目标,然后再继续前进。

首先,为什么要并行化代码? 我假设您希望程序运行得更快。 那意味着

  1. 您应该首先编写一个有效的顺序实现。
  2. 您应该分析并调整该实现。
  3. 如果(且仅当)您的程序仍然太慢而无法满足您的目的,则在以下情况下应并行化它:
    1. 程序的大部分可以并行化(请查看阿姆达尔定律 )。
    2. 您的顺序实现充分利用了缓存 即使对于顺序代码,高速缓存也很可能成为瓶颈,因此,如果您的代码不是高速缓存的,则在并行化它时可能会变慢。

要点1.和2.可能是您应该花费时间的地方。 赔率是一个高度优化的顺序执行是绰绰有余您的需求,这将是便宜/容易/更快的开发和维护。

如果您决定并行化代码,则应该看一下OpenMP 线程可能是编写人类已知的并行程序的最糟糕的方法之一。 您可能认为OpenMP的运行时系统对您来说太慢了,但是再次,您应该退后一步,想一想为什么。

如果您的算法需要大量的锁和障碍,则可以通过使用更快的锁和障碍来获得较小的加速。 如果您改进算法以使用更少的锁和障碍,则可以实现更大的加速。

这是安全的,尽管从设计的角度来看,只给每个线程提供其内部矢量会更安全,所以将来发生不安全行为的可能性较小

是的,在您的用例中是安全的,因为您无需修改​​共享数据。 但是,我希望将对std::vector<short>的引用传递给每个线程以简化用法:

void addVec(std::vector<short> & arr)
{ 
   arr.push_back(some_data);
}

std::vector<std::vector<short> > arr(2);
boost::threads th1(addVec, boost::ref(arr[0]));
boost::threads th2(addVec, booost::ref(arr[1]));
th1.join();
th2.join();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM