C++ 同一类型的STL容器类是线程安全的吗?

C++ 同一类型的STL容器类是线程安全的吗?,c++,multithreading,C++,Multithreading,线程1上有一个向量a,线程2上也有一个向量B 如果向量A和B是不同的实例化对象,但类型相同,那么同时写入向量A和B安全吗 如果不是,为什么这与在线程1上写入int c和在线程2上写入int d不同?没有一个标准容器类是线程安全的。如果两个不同的线程访问修改共享资源的同一成员函数,则代码不安全 但是在您的代码中,vectorA和vectorB不是共享资源,那么您的代码是安全的,假设向量本身不包含共享资源。STL容器不是线程安全的。因此,您必须实现自己的同步机制,才能在多线程环境中使用STL 鉴于上

线程1上有一个向量a,线程2上也有一个向量B

如果向量A和B是不同的实例化对象,但类型相同,那么同时写入向量A和B安全吗


如果不是,为什么这与在线程1上写入int c和在线程2上写入int d不同?

没有一个标准容器类是线程安全的。如果两个不同的线程访问修改共享资源的同一成员函数,则代码不安全


但是在您的代码中,vectorA和vectorB不是共享资源,那么您的代码是安全的,假设向量本身不包含共享资源。

STL容器不是线程安全的。因此,您必须实现自己的同步机制,才能在多线程环境中使用STL

鉴于上述情况,请回答您的问题: 读写一个类型的实例是安全的,即使另一个线程正在读写同一类型的不同实例。 例如,在您的示例中,给定相同类型std::vector的对象A和B,如果A在线程1中写入,B在线程2中读取,则是安全的

为什么这与在不同线程上写入两个int不同? 都一样。 正如写入两个不同线程中的两个独立整数不需要任何同步一样,写入两个独立线程中的两个不同向量也不需要任何同步

以下是来自MSDN的信息:

以下线程安全规则适用于标准C++库中除SyrdypTr和IoSoW类之外的所有类,如下所述。 单个对象对于从多个线程读取是线程安全的。 例如:给定一个对象A,同时从线程1和线程2读取A是安全的

如果一个线程正在写入单个对象,则必须保护同一线程或其他线程上对该对象的所有读写操作。 例如:给定一个对象A,如果线程1正在写入A,则必须阻止线程2读取或写入A

读写一个类型的实例是安全的,即使另一个线程正在读写同一类型的不同实例。 例如:给定相同类型的对象A和B,如果A在线程1中写入,B在线程2中读取,则是安全的


我非常希望所有标准容器实现对于非共享集合(如您所说的相同类型的不同集合)都是线程安全的

<>但是,确切地说,你必须查阅你的库文档,因为标准根本没有解决线程问题,C++ 11在这里做了一些修改,但是实现并没有与

大不相同。
唯一的边缘情况是一些字符串库实现,尤其是io流,这主要是因为共享的信息,如区域设置定义、字符集,以及可能延迟构建的哨兵;主要的风险是多个线程同时构造相同的全局数据。当您主动操作和嵌入区域设置方面时,风险会变得更大。

与C++0x FDI相关的参考文献,因为C++03根本没有提到线程

第一:是的,在两个不同的线程中使用两个不同的容器小心通过引用/指针产生别名是安全的

§17.6.5.9数据竞争避免

2,A/C++标准库函数不直接或间接访问除当前线程之外的线程1.10访问的对象,除非对象直接或间接地通过函数的参数访问,包括这个.< /P>

3 /AcC++标准库函数不直接或间接修改对象以外的线程可访问的对象1.10,除非对象直接或间接地通过函数的非const参数访问,包括这个。 进一步注意,如果实现在不同对象之间使用共享状态,则应适当保护访问,以使其对用户不可见

更重要的是,在一个容器中访问两个不同的对象是安全的

§23.2.2容器数据竞赛

2/尽管有17.6.5.9的规定,但当同时修改同一序列中不同元素(向量除外)中包含的对象的内容时,需要实现以避免数据竞争


此外,尽管C++98/C++03没有在标准中解决这个问题,但任何质量实现都已经符合要求。如果您使用的是MSVC或gcc的库,那么它已经可以工作了,而且它可能也适用于大多数其他编译器的库。

是的,它是安全的。如果线程1分配向量A,线程2分配向量B,并且两个线程都不知道另一个的向量实例,那么它将是安全的。这与访问ints没有什么不同

现在,如果线程1
线程2试图访问同一个向量或int,这不是线程安全的,您必须添加同步。

如果您要求标准强制的保证,您必须指定您所指的标准版本,因为在C++11之前,标准完全忽略了多线程。这个答案避免了直接的问题。问题是,如果你有不同的向量,你能同时使用它们吗。