这里有一个让我困扰的最小化示例。
如果我运行那段代码几次,可能会得到以下这种结果:
我意识到的是,最后4个输出总是具有相同数量的字符(8个)。但由于某种原因(并非总是如此),前四个输出中的一个或多个包含更多的字符(14个)。看起来使用openmp改变了指针的“性质”(这是我天真的理解)。但这种行为是否正常?我应该期望一些奇怪的行为吗?
编辑
这里是一个实时测试,显示代码的稍微复杂版本中出现了相同的问题。
#include <iostream>
#include <memory>
#include"omp.h"
class A{
public:
A(){std::cout<<this<<std::endl;}
};
int main(){
#pragma omp parallel for
for(unsigned int i=0;i<4;i++){
std::shared_ptr<A> sim(std::make_shared<A>());
}
for(unsigned int i=0;i<4;i++){
std::shared_ptr<A> sim(std::make_shared<A>());
}
}
如果我运行那段代码几次,可能会得到以下这种结果:
0xea3308
0xea32d8
0xea3338
0x7f39f80008c8
0xea3338
0xea3338
0xea3338
0xea3338
我意识到的是,最后4个输出总是具有相同数量的字符(8个)。但由于某种原因(并非总是如此),前四个输出中的一个或多个包含更多的字符(14个)。看起来使用openmp改变了指针的“性质”(这是我天真的理解)。但这种行为是否正常?我应该期望一些奇怪的行为吗?
编辑
这里是一个实时测试,显示代码的稍微复杂版本中出现了相同的问题。