【问题标题】:is GCC STL thread-safe?GCC STL 线程安全吗?
【发布时间】:2011-09-07 17:55:42
【问题描述】:

我在网上发现了相互矛盾的信息: http://www.sgi.com/tech/stl/thread_safety.html

STL 的 SGI 实现仅在以下意义上是线程安全的 同时访问不同的容器是安全的,并且 对共享容器的同时读取访问是安全的。如果 多个线程访问单个容器,并且至少有一个线程 可能会写,那么用户有责任确保 容器访问时线程间的互斥。

http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.html

用户代码必须防止并发方法调用,这可能 访问任何特定库对象的状态。通常情况下, 应用程序程序员可以推断必须持有哪些对象锁 在方法调用中引用的对象上。没有进入伟大的 详细,这里是一个需要用户级锁的例子:

只要在多线程程序中使用所有库对象都是安全的 因为每个线程小心地锁定任何其他线程的访问,而它 使用对另一个线程可见的任何对象,即处理库对象 像任何其他共享资源一样。一般来说,这个要求包括 对对象的读写访问;除非另有记录为 安全,不要假设两个线程可以访问一个共享标准 库对象。

我把重要的部分加粗了——也许我不明白他们的意思,当我阅读对象状态时,我想到了 STL 容器

【问题讨论】:

    标签: c++ gcc stl thread-safety


    【解决方案1】:

    我是怎么理解的:

    两份文件都以不同的方式说同样的话。 MS STL 实现(实际上是 Dinkumware 之一)与您引用的 SGI 文档几乎相同。他们的意思是他们没有做任何事情来使 STL 对象(例如容器)线程安全,很可能是因为这会增加许多单线程应用程序中不必要的开销。任何对象在他们的术语中都是线程安全的,你可以从多个线程中读取它。

    文档还保证在某些后台线程中不会修改 STL 对象。

    【讨论】:

      【解决方案2】:

      FWIW 我不久前更新了 libstdc++ 文档,现在它说(强调我的):

      当其中一个或多个访问修改状态时,用户代码必须防止访问任何特定库对象状态的并发函数调用。

      【讨论】:

        【解决方案3】:

        您引用的信息并不矛盾。在多线程环境中使用 STL 库应该是安全的(实际上,我曾使用过一种并非如此的实现),但同步对库对象的访问是用户的负担。例如,如果您在一个线程中创建一组整数,在另一个线程中创建另一组整数,并且您不在线程之间共享它们中的任何一个,那么您应该能够使用它们;如果您在线程之间共享集合的实例,则由您来同步对集合的访问。

        【讨论】:

        • 其实他们是。有人说,在没有保护的情况下同时读取共享库对象是安全的,只要没有人修改该对象。另一个说任何同时访问都是不安全的。
        • @n.m.是的:“并且至少一个线程可能会写”表明您在说什么。我关注的事实是,SGI 实现保证了对不同对象的安全同时访问,而 GNU 文档警告了从多个线程访问同一对象的危险。
        【解决方案4】:

        STL 已不复存在。它被 C++ 标准库取代。如果您使用 ISO C++ 和标准库,您应该阅读 (a) 标准和 (b) 随您的 C++ 实现一起提供的文档。

        SGI STL 文档大多具有历史意义,除非您出于某种原因实际使用 SGI STL。

        【讨论】:

        • @MSalters:没错,但我的主张仍然成立。
        • @nm:你当然是对的,但是 ISO 标准(至少 1998/03 版本)甚至没有提到线程,我们需要使用提供某种级别线程的具体库实现安全。
        猜你喜欢
        • 1970-01-01
        • 2011-11-19
        • 2011-08-20
        • 1970-01-01
        • 2012-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多