这是我的线程编程代码。我正在初始化两个线程,就像第一个线程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
答案 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";
,因为它们只能在线程结束之后发生。