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

时间:2010-06-01 16:06:30

标签: c++ c multithreading

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

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

由于

9 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

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

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

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

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

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

答案 3 :(得分:2)

从 C++11 开始:

<块引用>

同一个容器中的不同元素可以同时修改 通过不同的线程,除了 std::vector< bool> 的元素 (例如, std::future 对象的向量可以接收值 来自多个线程)。

cppreference 详细讨论了容器 here 的线程安全性。 在 Quora post 中找到链接。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

这应该没问题,但是由于虚假共享,每个线程可能会使对方的缓存行无效

,最终会导致性能不佳

答案 8 :(得分:-1)

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

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

与多线程编程一样,还有许多更微妙的方法可以解决这个问题。但原则上你所描述的内容会很好。