多个线程可以访问不同位置的向量吗?

假设我有一个int向量,我已经预先填充了100个元素,值为0。

然后我创建2个线程并告诉第一个线程用数字填充元素0到49,然后告诉线程2用数字填充元素50到99。 可以这样做吗? 否则,实现这一目标的最佳方法是什么?

谢谢

是的,这应该没问题。 只要您可以保证不同的线程不会修改相同的内存位置,就没有问题。

是的,对于vector的大多数实现,这应该没问题。 也就是说,这将在大多数系统上具有非常差的性能,除非您有非常多的元素并且您正在访问彼此相距很远的元素,因此它们不会存在于同一缓存行中…否则在许多系统上,两个线程将来回互相使用的缓存无效(如果您经常读/写这些元素),导致两个线程中都有大量缓存未命中。

vector不是线程安全的”这一事实并不意味着什么。 这样做没有问题。

此外,您不必在堆上分配矢量(作为建议的答案之一)。 您只需确保向量的生命周期覆盖线程的生命周期(更准确地说 – 这些线程访问向量的位置)。

当然,既然你希望你的两个线程都在同一个向量上工作 – 它们必须通过指针/引用而不是值来从某个地方接收它。

从不同的线程中访问数组的相同元素也绝对没有问题。 但是你应该知道你的线程不是唯一一个访问它的线程,并分别处理它。

简单来说 – 从不同的线程中访问数组没有问题。 从不同的线程访问相同的元素就像从不同的线程访问单个变量 – 相同的预防措施/后果。

您需要担心的唯一情况是添加新元素,这在您的情况下是不可能的。

没有理由不能做到这一点。 但是,一旦你开始混合访问(两个线程访问相同的元素),它就变得更具挑战性。

vector不是线程安全的。 你需要保护线程之间的向量。 在您的情况下,它取决于vector实现。 如果从不同的线程访问\修改了向量内部数据,它纯粹依赖于向量impl。

对于数组,可以确定(线程不访问相同的内存区域); 但是如前所述,如果使用std :: vector类,结果可能取决于它的实现方式。 实际上我没有看到矢量类的[]的实现如何是线程不安全的(假设线程试图访问不同的“索引”),但它可能是。 解决方案是:坚持使用数组,或使用信号量或类似方法控制对向量的访问。

这应该没问题,但是由于错误共享,每个线程可能会使彼此的缓存行无效,最终会导致性能不佳

你所描述的很有可能,应该说得很好。

但请注意,线程需要处理std::vector* ,即指向原始向量的指针—您可能应该在堆上分配向量,而不是堆栈。 如果直接传递向量,则将调用复制构造函数并在每个线程上创建数据的单独副本。

与multithreading编程一样,还有许多更微妙的方法可以解决这个问题。 但原则上你所描述的将会奏效。