我有多个线程同时调用共享对象的std::vector
的push_back()
方法。 std::vector
是线程安全的吗?还是我需要自己实现机制来使其线程安全?
我希望避免做额外的“锁定和释放”工作,因为我是库的用户而不是库的设计者。我希望寻找现有的线程安全解决方案来处理向量。 boost::vector
如何呢?它是从boost 1.48.0开始新引入的。它是线程安全的吗?
我有多个线程同时调用共享对象的std::vector
的push_back()
方法。 std::vector
是线程安全的吗?还是我需要自己实现机制来使其线程安全?
我希望避免做额外的“锁定和释放”工作,因为我是库的用户而不是库的设计者。我希望寻找现有的线程安全解决方案来处理向量。 boost::vector
如何呢?它是从boost 1.48.0开始新引入的。它是线程安全的吗?
如果从不同线程调用标准库函数可能引入数据竞争,则程序的行为未定义。这可能发生的条件在17.6.5.9中指定。[注意:修改在线程之间共享的标准库类型的对象会导致未定义行为,除非明确指定该类型的对象可以在没有数据竞争的情况下共享,或者用户提供了锁定机制。—endnote]
...和17.6.5.9 [res.on.data.races]。本节基本上详细说明了非正式描述中的内容。
我有多个线程同时调用一个 std::vector 共享对象上的 push_back() 方法。std::vector 是否是线程安全的?
这是不安全的。
那么我需要自己实现机制使其线程安全吗?
是的。
我希望避免进行额外的“锁定和释放”工作,因为我是库的使用者而不是库的设计者。我想寻找现有的线程安全解决方案来处理 vector。
嗯,vector 的接口对于并发使用并不理想。如果客户端可以访问锁,则没问题,但是对于每个操作抽象出锁定的接口 —— 不可以。事实上,除非使用外部锁(假设您需要进行突变操作),否则 vector 的接口无法保证线程安全。
那 boost::vector 呢?它在 boost 1.48.0 版本及以后新引入的。它是线程安全的吗?
文档中说明:
//! boost::container::vector is similar to std::vector but it's compatible
//! with shared memory and memory mapped files.
concurrent_vector
。严格来说,它在内部与std::vector
有很大不同,并且其API不完全兼容,但仍然可能适用。您可以在TBB开发人员的博客中找到一些有关其设计和功能的详细信息。