考虑以下代码:
class info{
public:
char name[10];
int age;
float money;
info(char nam[10], int ag, float mon):age(ag),money(mon){
strcpy(name,nam);
}
info():age(0),money(0){
strcpy(name,"");
}
};
void *foo(void* data){
info *args;
args=static_cast<info*>(data);
cout<<"\nName: "<<args->name<<endl;
cout.flush();
cout<<"Age: "<<args->age<<endl;
cout.flush();
cout<<"Balance: "<<args->money<<endl;
cout.flush();
pthread_exit(NULL);
}
int main(){
int x;
cout<<"Enter number of accounts: ";
cin>>x;
info *A[x]; /*MARKED LINE*/
pthread_t t[x];
int rc;
for(int i=0;i<x; i++){
A[i]=new info();
cout<<"\nEnter name: ";
cin>>A[i]->name;
cout<<"Enter age: ";
cin>>A[i]->age;
cout<<"Enter Balance: ";
cin>>A[i]->money;
}
for(int i=0; i<x; i++){
rc=pthread_create(&t[i],NULL,foo,static_cast<void*>(A[i]));
if(rc!=0){
cout<<"Unable to create thread";
exit(-1);
}
}
pthread_exit(NULL);
}
此代码的输出是多线程程序所期望的随机cout
。但是当我从
MARKED LINE
时
info *A[x];
至info *A[x]={0}
,
我按照我输入的顺序方式得到cout
,就像我输入A,B和C一样,输出也是相同的,而不是随机的。我想知道为什么会这样。
答案 0 :(得分:2)
...如果您尝试将不同的标志传递给编译器,控制代码生成(例如优化级别或运行时分析),您可能会观察到不同的结果。
不保证从不同线程获得的输出具有任何特定顺序。这并不一定意味着输出每次都会随机混合。实际上,你可能会得到第一个随机顺序,但是第二次运行它时,线程输出将是顺序的。
&#34;没有保证&#34;无论如何都意味着,没有任何保证。在内部对齐方面,以一种不会真正影响程序结果总体性的方式向代码添加另一个语句或以不同顺序声明对象肯定会影响编译代码的运行时配置文件内存中的数据或代码,以一种或另一种方式以公共运行时行为发生变化的充分方式。
因此,除非您实现显式线程同步,否则您无法保证结果。只需再次运行程序就可以获得不同的结果,当然对变量声明进行微小的更改也会产生影响。
您对代码所做的更改很可能会生成执行的其他指令 - 尤其是在您未使用-O
的情况下。这会将所有后续指令转移到内存中,这很容易导致不同的内部代码对齐,这会影响运行时行为。