假设我有一个int向量,我已经预先填充了100个值为0的元素。
然后我创建2个线程并告诉第一个线程用数字填充元素0到49,然后告诉线程2用数字填充元素50到99。可以这样做吗?否则,实现这一目标的最佳方式是什么?
由于
答案 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*
,即指向原始向量的指针---您可能应该在堆上分配向量,而不是堆栈。如果直接传递向量,则将调用复制构造函数并在每个线程上创建单独的数据副本。
与多线程编程一样,还有许多更微妙的方法可以解决这个问题。但原则上你所描述的内容会很好。