C++ std::vector还是boost::vector线程安全?

C++ std::vector还是boost::vector线程安全?,c++,boost,stl,thread-safety,std,C++,Boost,Stl,Thread Safety,Std,我有多个线程在std::vector的共享对象上同时调用push_back()。std::vector线程安全吗?还是我需要自己实现该机制以使其线程安全? 我想避免做额外的“锁定和释放”工作,因为我是一个库用户,而不是一个库设计师。我希望为vector寻找现有的线程安全解决方案。如何看待boost::vector,它是从boost 1.48.0开始新引入的。它是否是线程安全的?< /P> < P> C++标准对标准C++库中的所有类都进行了线程保证。这些保证可能不是您所期望的,但对于所有标准C+

我有多个线程在
std::vector
的共享对象上同时调用
push_back()
std::vector
线程安全吗?还是我需要自己实现该机制以使其线程安全?

我想避免做额外的“锁定和释放”工作,因为我是一个库用户,而不是一个库设计师。我希望为vector寻找现有的线程安全解决方案。如何看待boost::vector,它是从boost 1.48.0开始新引入的。它是否是线程安全的?< /P> < P> C++标准对标准C++库中的所有类都进行了线程保证。这些保证可能不是您所期望的,但对于所有标准C++库类库,都需要保证某些线程安全性。确保你阅读了保证,但是,标准C++容器的线程保证通常不符合你希望的。对于一些不同的、通常更强的类别,会做出保证,下面的答案特别适用于容器。容器基本上具有以下螺纹安全保证:

  • 同一容器可以有多个并发读卡器
  • 如果只有一个作家,就不会有更多的作家和读者
  • 这些通常不是人们想要的线程安全保证,但考虑到标准容器的接口,它们是非常合理的:它们旨在在没有多个访问线程的情况下高效地使用。为他们的方法添加任何类型的锁定都会干扰这一点。除此之外,容器的接口对于任何形式的内部锁定都不是真正有用的:通常使用多个方法,访问取决于以前访问的结果。例如,在检查容器是否为
    empty()
    后,可能会访问元素。但是,使用内部锁定无法保证对象在实际访问时仍在容器中

    为了满足提供上述保证的要求,您可能必须对并发访问的容器使用某种形式的外部锁定。我不知道boost容器的情况,但是如果它们有一个类似于标准容器的接口,我会怀疑它们有完全相同的保证

    17.6.4.10【关于目标的决议】第1段给出了保证和要求:

    如果从不同线程调用标准库函数可能导致数据竞争,则程序的行为是未定义的。17.6.5.9中规定了可能发生这种情况的条件。[注意:修改线程之间共享的标准库类型的对象存在未定义行为的风险,除非该类型的对象被明确指定为无数据争用的可共享对象,或者用户提供锁定机制。-尾注]

    。。。和17.6.5.9[关于数据的决议]。本节主要详细介绍了not中更为非正式的描述

    我有多个线程在std::vector的共享对象上同时调用push_back()。std::vector线程安全吗

    这是不安全的

    或者我需要自己实现该机制以使其线程安全

    我想避免做额外的“锁定和释放”工作,因为我是一个库用户,而不是一个库设计师。我希望为vector寻找现有的线程安全解决方案

    vector的接口不是并发使用的最佳接口。如果客户机可以访问锁,那么就可以了,但是对于每个操作,接口都要抽象锁——不可以。事实上,如果没有外部锁,vector的接口就不能保证线程安全(假设您需要的操作也会发生变化)

    那么boost::vector呢,它是从Boost1.48.0开始新引入的。它是线程安全的吗

    文件说明:

    //! boost::container::vector is similar to std::vector but it's compatible
    //! with shared memory and memory mapped files.
    
    我有多个线程在std::vector的共享对象上同时调用push_back()。。。我希望为vector寻找现有的线程安全解决方案


    查看中的
    并发向量
    。严格地说,它在内部与std::vector有很大的不同,并且不完全兼容API,但可能仍然适用。您可能会发现其设计和功能的一些细节。

    这必须是dup。但是,没有,没有一个标准容器是线程安全的。另请参见:不完全是重复的,但相关的:“线程安全”下的此链接应包含您需要的所有信息:。如果它只是功能,则会。但是,有一些涉及的对象保证不会被读取操作修改。此外,可重入性指的是在单线程程序中可以递归调用的特性。通过“reader”和“writer”,您指的是容器的结构,而不是写入其中的对象,对吗?例如,只要不插入或删除元素,就可以同时写入3个不同的向量元素,并从第四个线程读取另外10个线程。迭代器有效性规则似乎与此相关。