在多线程 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
的复制构造函数不是线程安全的?
你能把真实的代码吗?以您发布的内容,无法知道它是否来自多线程情况。
我同意上面关于复制构造函数的评论。我相信异步修改的引用计数器是一个经典问题。
你提到了插件,它们是由一个项目在一个二进制文件中构建的吗?还是某种dll
s?
SRY,“某物”不是同一个类或类型。我提到 variable_1 可以是例如 int 和 double 类型的 variable_2。
【参考方案1】:
AFAIK,分配器不是线程安全的。您应该以线程安全的方式分配向量(保留)或使用线程安全的分配器。
【讨论】:
以上是关于在多线程 C++ 程序中使用 std::vector 时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章