可能重复:
stl 向量并发读取线程安全吗?
我有一个具有一定数量工人的多线程程序,每个工人都有一个'workerID',它本质上只是该线程的唯一整数。我想使用结构向量来管理这些线程。我的问题是,如果线程 4 想要在线程 8 想要访问 myVector[8] 的同时访问 myVector[4],我会有问题吗?
可能重复:
stl 向量并发读取线程安全吗?
我有一个具有一定数量工人的多线程程序,每个工人都有一个'workerID',它本质上只是该线程的唯一整数。我想使用结构向量来管理这些线程。我的问题是,如果线程 4 想要在线程 8 想要访问 myVector[8] 的同时访问 myVector[4],我会有问题吗?
如果您在进入多线程场景之前设置了向量,然后您只想从多个线程中读取向量而不修改它,那么它是线程安全的。您甚至可以同时从两个以上的线程中读取相同的元素,只需确保没有线程以任何方式修改向量。将向量及其所有元素视为只读。
但是,对于修改,标准库中的所有容器都不是线程安全的。您需要自己实现同步。
C++11 引入了很多同步原语,所以如果你的编译器支持,你可以使用它们。
不可以。跨线程管理向量类是不安全的,您需要使用一些同步机制(例如互斥锁)来保护对std::vector<>
实例的读/写访问。
你不会有问题(afaik),除非他们使用相同的元素。
但是,如果他们删除了某些东西,或者 push_back 某些东西等等,那就是个坏主意。
为了安全起见,请使用锁。
一般来说 std::vector 不是线程安全的。但你想做的是安全的。如果您只在多个线程中读取向量,这将起作用。如果每个线程只写入自己的偏移量,它也可以工作。如果您开始在线程中调整向量的大小,或者如果多个线程想要写入相同的偏移量,那么肯定不会起作用。