为什么C ++中的THREADS在执行时给出不同的输出?

时间:2018-06-19 17:17:43

标签: c++ multithreading

这是我的线程编程代码。我正在初始化两个线程,就像第一个线程t1是使用person类的非成员函数来初始化的,而第二个线程t2是使用person类的成员函数来初始化的。 现在我的疑问是为什么每次输出都不同。

class person {
    int a;
public:
    person();
    person(int a):a(a){}

    void  pmemberfun() {
        cout << a;
    }    
};

void  func1() {
    cout << "\n fun1 \n";
}

int main() {
    thread t1(func1);
    //non member fun of class
    cout << "\nmain()\n";
    if (t1.joinable()) {
        t1.join();
        cout << "\njoiined1\n";
    } else {
        cout << "\nnot joinable";
    }

//using member function of class
    person a(10);
    thread t2(&person::pmemberfun, a);
    cout << "\nmain()\n";
    if (t2.joinable()) {
        t2.join();
        cout << "\njoiined\n";    
    } else {
        cout << "not joinable";
    }

第一次执行时的输出-

main()
 fun1
joiined 1
10
main()
joiined 2

第二次执行时输出

 fun1
main()
joiined 1
10
main()
joiined 2

1 个答案:

答案 0 :(得分:2)

这样做的时候

thread t1(func1);
//non member fun of class
cout << "\nmain()\n";

您基本上有

cout << "\n fun1 \n";
cout << "\nmain()\n";

但是,由于cout << "\n fun1 \n";在线程内部,因此它可能会或可能不会在cout << "\nmain()\n";之前执行。你有同样的事情

thread t2(&person::pmemberfun, a);
cout << "\nmain()\n";

甚至cout << "\nnot joinable";可能会在线程应该打印的内容之前打印,因为if (t1.joinable())可以在线程打印之前进行评估。唯一不会混乱执行的行是cout << "\njoiined1\n";,因为它们只能在线程结束之后发生。