[英]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.可能是您应该花费时间的地方。 赔率是一个高度优化的顺序执行是绰绰有余您的需求,这将是更便宜/容易/更快的开发和维护。
如果您决定并行化代码,则应该看一下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.