std :: vectors线程安全吗?

时间:2012-06-21 18:17:12

标签: c++ multithreading vector

  

可能重复:
  Is stl vector concurrent read thread-safe?

我有一个多线程程序,它有一定数量的worker,每个worker都有一个'workerID',它实际上只是该线程的一个唯一整数。我想使用结构向量来管理这些线程。我的问题是,如果线程4想要在线程8想要访问myVector [8]的同时访问myVector [4],我会遇到问题吗?

4 个答案:

答案 0 :(得分:3)

如果您在进入多线程场景之前设置了向量,然后您只想从多个线程读取向量而不修改它,那么它是线程安全的。您可以同时读取来自两个以上线程的相同元素,只需确保没有线程以任何方式修改该向量。将向量及其所有元素视为只读。

但是,对于修改,标准库中的所有容器都不是线程安全的。您需要自己实现同步。

C ++ 11引入了许多synchronization primitives,所以如果你的编译器支持,你可以使用它们。

答案 1 :(得分:3)

没有。跨线程管理向量类是不安全的,您需要使用一些同步机制(例如互斥锁)来保护对std::vector<>实例的读/写访问。

答案 2 :(得分:1)

除非他们使用相同的元素,否则你不会遇到问题(afaik)。

但是如果他们删除了某些内容,或者推送了某些东西等等,这是一个坏主意。

为了安全起见,请使用锁。

答案 3 :(得分:1)

一般来说std :: vector不是线程安全的。但你想做的是安全的。如果您只是在多个线程中读取向量,这将起作用。如果每个线程只写入自己的偏移量,它也会起作用。如果您开始执行调整线程中向量的大小,或者多个线程想要写入相同的偏移量,那么肯定不会起作用的是。