Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::vectors线程安全吗?_C++_Multithreading_Vector - Fatal编程技术网

C++ std::vectors线程安全吗?

C++ std::vectors线程安全吗?,c++,multithreading,vector,C++,Multithreading,Vector,可能重复: 我有一个多线程程序,它有一定数量的worker,每个worker都有一个“workerID”,它本质上只是该线程的一个唯一整数。我想使用结构向量来管理这些线程。我的问题是,如果线程4想在线程8想访问myVector[8]的同时访问myVector[4],我会有问题吗?如果在进入多线程场景之前设置了向量,然后只想从多个线程读取向量,而不想修改它,那么它是线程安全的。您甚至可以同时从两个以上的线程读取相同的元素,只需确保没有线程以任何方式修改向量。将向量及其所有元素视为只读 但是,对于

可能重复:


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

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

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

C++11引入了许多,因此如果编译器支持,您可以使用它们。

除非它们使用相同的元素,否则不会出现问题(afaik)

但是如果他们删除了一些东西,或者把一些东西推回去,等等,这是一个坏主意


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

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

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

谢谢你,我一直在考虑使用锁,我唯一的保留意见(因为我对多线程不熟悉)是对使用锁的性能影响。正如Thomas提到的问题,如果数据是预先设置的,并且所有线程只执行读取,那么它是安全的。如果一个线程正在执行写操作,而没有其他线程正在读取该元素,那么它可能是安全的,但我不确定该标准对它的保证有多严格(因为在同一个单词中存储的元素之间存在读-修改-写问题)。它绝对保证了这一点,请参见@JonathanWakely:这对于cx11标准是正确的,不是吗??OP没有明确提到这一点。但无论如何,很高兴知道…没有提到,但我对@bdow作出了回应,而C++03标准没有提到任何关于线程的内容,因此C++11标准是唯一相关的,这让我投了反对票。不过我不打算向上投票,因为这是一个dup,所以将OP指向具有大量引用的更具建设性。@JonathanWakely:我已投票关闭,但我不会删除我的答案,因为这没有害处。还有一个问题,如果另一个线程为向量锁定互斥锁以更改其中的值,其他仅仅读取给定位置的线程需要担心什么吗?@Whyrusleeping:如果一个线程写入,那么它应该为所有其他线程锁定,即使是读取。也就是说,当一个线程修改时,不允许其他线程写入/修改和读取/检查。谢谢,这就是我需要知道的一切!