关于STL线程安全和STL调试的问题

时间:2010-04-13 14:47:59

标签: c++ multithreading stl

我有两个关于STL的问题

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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

  1. 因为还有单线程程序。
  2. 看看here