如果没有插入并且只有 .find(),在多个线程上使用 C++ STL 容器是不是安全?

Posted

技术标签:

【中文标题】如果没有插入并且只有 .find(),在多个线程上使用 C++ STL 容器是不是安全?【英文标题】:Is it safe to use C++ STL containers on multiple threads if no insertions and only .find()?如果没有插入并且只有 .find(),在多个线程上使用 C++ STL 容器是否安全? 【发布时间】:2010-01-27 17:46:02 【问题描述】:

在 C++ 中,如果您不插入,只在其上执行 .find() 操作,那么在不同线程中同时使用 std::map 或 std::vector 是否安全?

【问题讨论】:

【参考方案1】:

当前的 C++ 标准没有关于线程的主题,因此没有解决这个问题。但是,您的特定 C++ 标准库实现的文档应该涵盖它。

【讨论】:

来自 VC++ (Visual Studio 2008),指的是 std 容器:单个对象对于从多个线程读取是线程安全的。例如,给定一个对象 A,从线程 1 和线程 2 同时读取 A 是安全的。【参考方案2】:

这是特定于实现的,标准不保证。

【讨论】:

我认为 sergiom 在实践中可能是正确的,但由于我找不到任何保证,我怀疑这不是我们可以指望的。 @Jay:原则上,容器可以将某些清理任务推迟到以后访问。仅仅因为容器在逻辑上被访问为 const 并不能保证它不会在引擎盖下翻转某些位(以线程不安全的方式)。 我认为在大多数情况下,你应该没问题,但标准不能保证,因为它没有提到线程,因此不能保证线程安全。因此,不能说它是安全的。 @Jay 一个更有用的问题是这适用于哪些实现。关于标准不保证的东西的默认假设应该是它不起作用。然后由程序员来证明它可以在他们的特定操作系统和编译器版本上工作。 @KeithB:我不认为缺乏标准是一个非常有用的论点。标准中没有很多东西是完全合理的假设。我认为您可能想要寻找一个肯定的断言,即这种行为不是线程安全的,而不是没有断言意味着它不安全。【参考方案3】:

是的。后台不会发生内存更改或缓存。

【讨论】:

您假设 find 方法在标准的所有实现中都不是有状态的。最好不要对 C++ 做任何假设。

以上是关于如果没有插入并且只有 .find(),在多个线程上使用 C++ STL 容器是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

Java读写资源保存内存上的锁

多线程死锁的产生原因以及如何避免

java锁-分类

NIO组件 Selector(选择器)

.net开发中,为何将100多个任务放入线程池却只有一个线程顺序执行

Java多线程编程