【问题标题】:question about STL thread-safe and STL debugging关于 STL 线程安全和 STL 调试的问题
【发布时间】:2010-04-13 14:47:58
【问题描述】:

我有两个关于 STL 的问题

1) 为什么 STL 不是线程安全的?有没有线程安全的结构?

2) 如何使用 GDB 调试 STL?在 GDB 中,如何打印矢量?

【问题讨论】:

    标签: c++ multithreading stl


    【解决方案1】:
    1. 容器数据结构几乎总是需要同步(例如mutex)以防止race conditions。由于 C++ 标准(C++0x 之前)不支持线程,因此无法将这些添加到 STL。此外,对于不需要同步的情况,同步非常昂贵。只要您手动执行此同步,STL 容器就可以在多线程应用程序中使用。或者,您可以创建自己的与 this thread-safe circular queue 等 STL 算法兼容的线程安全容器。
    2. vector 包含一个连续的内存块。因此,一旦找到指向该内存块的指针,它就可以像常规数组一样显示。具体细节取决于您使用的 STL 实现。

    【讨论】:

      【解决方案2】:

      标准的 c++ 容器不是线程安全的,因为您实际上很可能需要比容器本身更高级别的锁定。换句话说,您可能希望两个或多个操作一起安全。

      例如,如果您有多个线程在运行:

      v.push_back(0);
      v.push_back(1);
      

      不会得到一个很好的 0 和 1 交替的向量,它们可能是混乱的。你需要锁定这两个命令才能得到你想要的。

      【讨论】:

        【解决方案3】:

        STL 不是线程安全的,因为很多人不需要线程安全,并且因为这将线程上下文引入到类中,否则这些类不需要了解线程的概念。

        您可以封装对容器的访问并提供您自己的线程安全(或您的特定设计和实现施加的其他限制。)

        【讨论】:

          【解决方案4】:
          1. 因为还有单线程程序。
          2. 看看here

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-07
            • 2011-08-20
            • 2010-09-15
            • 2011-07-27
            • 1970-01-01
            相关资源
            最近更新 更多