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

Roy*_*NEU 2 c++ containers multithreading thread-safety stdvector

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

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

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

谢谢!

Qui*_*mby 5

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

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

我认为你误解了如何vector运作。对象本身只包含几个指针,仅此而已。内存几乎总是从动态存储(堆)分配。除非您用自己的分配器覆盖它并使用alloca或类似的危险东西。

所以如果你这样做

std::vector<int> local_variable{1,2,3,4};
Run Code Online (Sandbox Code Playgroud)

内部三个指针的内存local_variable将位于堆栈上,但1,2,3,4对象位于堆上。