在多线程 C++ 程序中使用 std::vector 时应用程序崩溃

Posted

技术标签:

【中文标题】在多线程 C++ 程序中使用 std::vector 时应用程序崩溃【英文标题】:crashing app when using std::vector in multithreaded C++ program 【发布时间】:2011-11-21 10:04:44 【问题描述】:

简化: 我正在为 realbasic 编写插件。我有两个带有自己线程的插件。一切都很好,直到我开始使用 std::vector。我在两个插件中都有 vector 变量,并且我没有使用向量来使用相同的数据或在线程或其他任何东西之间共享数据。我的模型如下所示:

thread_1
    vector<> variable_1;
    foreach
         variable_1.push_back(something);
    



thread_2
    vector<> variable_2;
    foreach
         variable_2.push_back(something);
    

如果我不将向量声明为静态,程序大多数时候会崩溃。但即使我将变量声明为静态,并使用一些算法,如排序或复制,崩溃再次出现。 似乎对向量的操作正在使用一些不是多线程安全的抽象类或其他东西。还是我做错了什么? 谢谢。

我使用的是 windows 7 x64,visual studio 2008 pro,在 win32 版本上编译。

【问题讨论】:

也许something 的复制构造函数不是线程安全的? 你能把真实的代码吗?以您发布的内容,无法知道它是否来自多线程情况。 我同意上面关于复制构造函数的评论。我相信异步修改的引用计数器是一个经典问题。 你提到了插件,它们是由一个项目在一个二进制文件中构建的吗?还是某种dlls? SRY,“某物”不是同一个类或类型。我提到 variable_1 可以是例如 int 和 double 类型的 variable_2。 【参考方案1】:

AFAIK,分配器不是线程安全的。您应该以线程安全的方式分配向量(保留)或使用线程安全的分配器。

【讨论】:

以上是关于在多线程 C++ 程序中使用 std::vector 时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为啥在多线程应用程序 C++ 中没有发生同步

在多线程应用程序中使用 opencv waitKey()

gdb:在多线程程序中调用函数而不进行线程

在多线程 C++ 中捕获进程的输出

为啥 volatile 在多线程 C 或 C++ 编程中没有用?

如何在多线程 C++ 中拆除观察者关系?