顺序多线程输出
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
。这会移动内存中的所有后续指令,这很容易导致不同的内部代码对齐,这是影响运行时行为的一个因素。
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 并发/多线程:是否可以以这种方式生成相同的输出?
- 控制多线程程序中的输出流
- 多线程使用者未产生与使用升压环形缓冲区的输入相同的输出
- 多线程中的不明确输出
- 为什么重新执行我的多线程代码后输出不一样
- 多线程环境中的输出字符串流出现问题
- c++中的有序多线程输出
- C多线程程序(窗口)中的文件输入和输出
- 同步STD cout输出多线程
- Linux多线程——线程不会产生任何预期的输出
- c++多线程-代码的输出
- 顺序多线程输出
- 程序输出有时只出现在多线程程序中
- 多线程文本输出打印到dos控制台重叠/混乱输出