【问题标题】:C++ - Sequential multi threading outputC++ - 顺序多线程输出
【发布时间】:2015-09-06 20:54:39
【问题描述】:

考虑这段代码:

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 一样,那么输出也将是相同的,而不是以随机方式。我想知道为什么会这样。

【问题讨论】:

  • 这可能是CC++ STL,而不是真正的C++
  • @Zereges:不,C++,虽然 C++ 很糟糕。他使用 C++ 风格 special_cast&lt;target_type&gt;(...)。但是,是的,我仍然同意,这是滥用 STL 的 C,而不是 C++。
  • 您的建议应该修改以使其更像 C++?那么原始查询呢?
  • 少了char[],多了std::stringstd::vector
  • 我不相信你。你每个都试了多少次?您的观察偶然发生的概率是多少?

标签: c++ multithreading


【解决方案1】:

...如果您尝试将不同的标志传递给编译器以控制代码生成(例如优化级别或运行时分析),您可能会观察到仍然不同的结果。

不保证您从不同线程获得的输出按任何特定顺序排列。这并不一定意味着每次输出都会随机混合。事实上,第一次你可能会得到一个随机顺序,但第二次运行它,线程输出将是连续的。

“无保证”的确切含义是,没有任何形式的保证。在代码中添加另一个语句,或以不同的顺序声明对象,以一种不会真正影响程序结果整体的方式肯定会影响编译代码的运行时配置文件,就内存中数据或代码的内部对齐而言,在以一种或另一种方式改变公共运行时行为的充分方式。

因此,除非您实现显式线程同步,否则无法保证结果。只需再次运行程序就可以得到不同的结果,当然对变量声明稍作改动也会产生效果。

您对代码所做的更改很可能会生成额外的指令来执行——尤其是在您没有使用-O 的情况下。这将转移内存中的所有后续指令,这很容易导致不同的内部代码对齐,这在运行时行为中起到了作用。

【讨论】:

  • 我也认为 {0} 参数的行为类似于代码中的某种标志。好吧,我终于从带有 STL 的 C 过渡到 C++(“字符串”和“向量”),然后代码就变成了它应该是的:随机。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多