std::valarray<T>的元素并发修改是否安全?

6

如果我理解正确的话,从 C++11 开始,可以安全地并发调用容器的 const 成员函数,并修改容器的元素,只要容器本身没有作为操作的一部分被修改(例如,在 cppreference.com 上查看的关于线程安全性的表格)。由于 std::valarray 没有列在(草案)标准的容器部分中,我不确定线程安全性是否也适用于它。换句话说,

  • 使用 std::valarray(特别是使用带有切片的 operator[])并发读取是否安全?
  • 如果 T 操作是安全的,那么修改 std::valarray<T> 的元素是否安全?

我想使用 std::valarray 来存储一个多维数字数组,并使用多个线程填充。


1
std::valarray 在容器家族中确实是一个孤儿。我怀疑很少有人使用它。 - SergeyA
在这个问题的示例中,它以线程安全的方式工作,另外你提供的链接无法打开... https://stackoverflow.com/q/21147991/3254405 - boateng
我的错误,有人修复了链接。如果可能的话,我想使用标准库而不是C++ AMP。 - tsnorri
1个回答

2
如果我正确理解您的问题,[res.on.data.races] 保护不同的数据片段免受数据竞争影响,在以下情况下生效:

除非这些对象是通过函数的参数(包括this)直接或间接访问的,否则C ++标准库函数不得直接或间接地访问其他线程可以访问的对象。

[container.requirements.dataraces] 在修改不同元素时添加了额外的保护,而这在严格意义上 valarray 缺乏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接