【问题标题】:Is it safe to modify elements of std::valarray<T> concurrently?同时修改 std::valarray<T> 的元素是否安全?
【发布时间】:2018-12-10 18:58:55
【问题描述】:

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

  • 同时从 std::valarray 读取是否安全(特别是通过使用带有切片的 operator[])?
  • 如果对 T 的操作是安全的,那么同时修改 std::valarray 的元素是否安全?

我想将 std::valarray 用于将使用多个线程填充的多维数字数组。

【问题讨论】:

  • std::valarray 确实是容器家族中的孤儿。我怀疑很多人会使用它。
  • 在这个问题的例子中,它以线程安全的方式工作,你的链接也没有打开..stackoverflow.com/q/21147991/3254405
  • 我的错误,有人修复了链接。如果可能,我想使用标准库而不是 C++ AMP。

标签: c++ multithreading c++11 valarray


【解决方案1】:

如果我没看错你的问题,[res.on.data.races] 会保护 distinct slice 不参与数据竞赛,在

C++ 标准库函数不得直接或间接 访问当前线程以外的线程可以访问的对象 除非对象直接或间接通过 函数的参数,包括this

[container.requirements.dataraces] 为对不同元素的修改添加了额外的保护,而 valarray 严格缺乏这些保护。

【讨论】:

    猜你喜欢
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多