C++ C++;-顺序多线程输出
考虑以下代码:C++ C++;-顺序多线程输出,c++,multithreading,C++,Multithreading,考虑以下代码: 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){ strcp
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);
}
类信息{
公众:
字符名[10];
智力年龄;
浮动货币;
信息(char-nam[10],int-ag,float-mon):年龄(ag),货币(mon){
strcpy(名称,nam);
}
信息():年龄(0)、金钱(0){
strcpy(名称“”);
}
};
void*foo(void*data){
信息*参数;
args=静态_转换(数据);
cout…如果您试图向编译器传递不同的标志,以控制代码生成(例如优化级别或运行时评测),您可能会观察到仍然不同的结果
您从不同线程获得的输出不保证以任何特定顺序。这并不意味着每次输出都会随机混合。事实上,您可能会在第一次获得随机顺序,但在第二次运行时,线程输出将是连续的
“不保证”确切地说,没有任何形式的保证。在代码中添加另一条语句,或以不同的顺序声明对象,以一种不会真正影响程序结果总体的方式,肯定会在足够长的时间内影响已编译代码的运行时配置文件,即内存中数据或代码的内部对齐以某种方式更改公共运行时行为的方式
因此,除非实现显式线程同步,否则无法保证结果。只需再次运行程序,就可以得到不同的结果,当然,对变量声明进行微小更改也会产生效果
您对代码所做的更改很可能会生成执行的附加指令——特别是如果您没有使用-O
。这会移动内存中的所有后续指令,并且很容易导致不同的内部代码对齐,这在运行时行为中起到了一定的作用。这是可能的C++代码> C++ C++ > STL> ,并不是真正的代码> C++< /COD> .@ ZeleGes:No.C++,虽然是可怕的C++。他用C++风格>代码> SuffyType(…)<代码>。但是,我仍然同意,这是C,滥用STL,不是C++。你建议修改什么使它更像C++?那原始查询呢?少<代码> char []<代码> STD::String 和 STD::向量< /代码>我不相信你。你尝试了多少次?你的观察几率是偶然发生的吗?我也认为{ 0 }参数就像代码中的某种类型的标志。最后,我从C到ST++到“C++”(“String”),“向量”),然后代码转到了它应该是什么:随机的。