代码之家  ›  专栏  ›  技术社区  ›  RoyGNEU

堆上的专用std::Vector是线程安全的吗?

  •  0
  • RoyGNEU  · 技术社区  · 3 年前

    这应该是一个简单的问题,但我很难找到答案。

    如果堆上有多个std::Vector,它们只能由 一根一根 它们是线程安全的吗?也就是说,因为向量将专用于特定的线程,所以我只关心向量调整自身大小时的内存访问冲突,而不是并发访问、数据竞争等。

    当然,我可以将每个向量粘贴到线程的堆栈上,但它们会非常大,可能会导致应用程序中的堆栈溢出。

    谢谢

    1 回复  |  直到 3 年前
        1
  •  3
  •   Quimby    3 年前

    对不同对象的访问是线程安全的, new 用于 std::vector 的分配器当然也是线程安全的。

    当然,我可以将每个向量粘贴到线程的堆栈上,但它们会非常大,可能会导致应用程序中的堆栈溢出。

    我想你误解了 vector 作品对象本身只包含几个指针,就是这样。几乎总是从动态存储器(堆)分配内存。除非您用自己的分配器覆盖它并使用 alloca 或者类似的危险物品。

    所以如果你这么做了

    std::vector<int> local_variable{1,2,3,4};
    

    里面三个指针的内存 local_variable 会在堆栈上但是 1,2,3,4 对象在堆上。