[英]C++ - Sequential multi threading output
考慮這個代碼:
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,那么輸出也將相同,而不是以隨機方式。 我想知道為什么會這樣。
...如果您嘗試將不同的標志傳遞給編譯器,即控制代碼生成(例如優化級別或運行時分析),您可能會觀察到仍然不同的結果。
您從不同線程獲得的輸出不能保證按任何特定順序排列。 這並不意味着每次都會隨機混合輸出。 事實上,您可能會在第一次獲得隨機順序,但第二次運行它時,線程輸出將是順序的。
“不保證”的意思就是,不提供任何形式的保證。 在代碼中添加另一條語句,或以不同的順序聲明對象,以不會真正影響程序結果的整體性的方式肯定會影響已編譯代碼的運行時配置文件,就內存中數據或代碼的內部對齊而言,在以一種或另一種方式改變公共運行時行為的一種充分方式。
因此,除非您實現顯式線程同步,否則無法保證結果。 只需再次運行程序即可獲得不同的結果,當然,對變量聲明稍作更改也可能會產生影響。
您對代碼所做的更改很可能會生成要執行的附加指令——尤其是在您沒有使用-O
。 這會轉移內存中的所有后續指令,這很容易導致不同的內部代碼對齊,這在運行時行為中起到了一個因素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.