当我在Release x64中构建它时,下面的程序崩溃了(所有其他配置运行正常)。
我做错了还是OpenMP问题? 有充分根据的解决方案非常受欢迎。
使用以下代码重现构建项目(控制台应用程序)。 在Release x64配置中使用/ openmp和/ GL以及(/ O1或/ O2或/ Ox)选项进行构建。 这是OpenMP支持,必须打开C ++优化。生成的程序应该(不应该)崩溃。
#include <omp.h>
#include <vector>
class EmptyClass
{
public:
EmptyClass() {}
};
class SuperEdge
{
public:
SuperEdge() {mp_points[0] = NULL; mp_points[1] = NULL;}
private:
const int* mp_points[2];
};
EmptyClass CreateEmptyClass(SuperEdge s)
{
return EmptyClass();
}
int main(int argc, wchar_t* argv[], wchar_t* envp[])
{
std::vector<int> v;
long count = 1000000;
SuperEdge edge;
#pragma omp parallel for
for(long i = 0; i < count; ++i)
{
EmptyClass p = CreateEmptyClass(edge);
#pragma omp critical
{
v.push_back(0);
}
}
return 0;
}
答案 0 :(得分:1)
我认为这是一个错误。在push_back调用中查看带有/ O2的ASM输出已经过优化,只有几个预留调用,而是看起来像直接访问。但是,保留呼叫似乎不在关键部分,最终会导致堆损坏。使用/ openmp / GL / Od执行发布x64,您将看到在asm中调用了push_back,它位于_vcomp_enter_critsect调用之间,并且不会崩溃。我会向MS报告。 (使用VS 2010测试)