建立多线程的三种方法:
- 普通函数
- 类对象(2.1类中重载小括号()运算符 , 2.2普通的成员函数)
- lambda
上代码:
#include <iostream>
#include <thread>//我们通过thread来建立多线程
using namespace std;
void my_function() {
cout << "我的第一个进程开始啦" << endl;
cout << "我的第一个进程结束啦" << endl;
}
class MyClass {
public:
void operator() () {
cout << "我的第二点一个进程开始啦" << endl;
cout << "我的第二点一个进程结束啦" << endl;
}
void Myprint_class() {
cout << "我的第二点二个进程开始啦" << endl;
cout << "我的第二点二个进程结束啦" << endl;
}
};
int main()
{
thread myprocess_1(my_function);
myprocess_1.join();
MyClass myclass;
thread myprocess_2_1(myclass);
myprocess_2_1.join();
thread myprocess_2_2(&MyClass::Myprint_class, myclass);
myprocess_2_2.join();
auto my_lamda = [] {
cout << "我的第三个进程开始啦" << endl;
cout << "我的第三个进程结束啦" << endl;
};
thread myprocess_3(my_lamda);
myprocess_3.join();
cout << "Hello World!\n";
}
结果:
我的第一个进程开始啦
我的第一个进程结束啦
我的第二点一个进程开始啦
我的第二点一个进程结束啦
我的第二点二个进程开始啦
我的第二点二个进程结束啦
我的第三个进程开始啦
我的第三个进程结束啦
Hello World!
join()和detach()
join()的作用是阻塞主线程,等待子线程完成。子线程结束后再来执行主线程
detach()让子线程与主线程分开运行互不影响,主线程不会等待子线程结束。如果主线程先结束,子线程会被系统接管。这种做法是一种比较危险的做法,不建议使用。
joinable()
joinable()用来判断此时是否可以用join(),因为有时候程序比较长而且是动态的,我们就需要进行判断join()是否可以使用。
代码:
#include <iostream>
#include <thread>//我们通过thread来建立多线程
using namespace std;
void my_function() {
cout << "我的第一个进程开始啦" << endl;
cout << "我的第一个进程结束啦" << endl;
}
int main()
{
thread myprocess_1(my_function);
if (myprocess_1.joinable()) {
cout << "可以使用join" << endl;
}
else
{
cout << "不可以使用join" << endl;
}
myprocess_1.join();
if (myprocess_1.joinable()) {
cout << "可以使用join" << endl;
}
else
{
cout << "不可以使用join" << endl;
}
std::cout << "Hello World!\n";
}
结果:
可以使用join
我的第一个进程开始啦
我的第一个进程结束啦
不可以使用join
Hello World!
主线程传给子线程的实参是通过值传递的方式进行传递的
上代码:
#include <iostream>
#include <thread>//我们通过thread来建立多线程
using namespace std;
class MyClass {
public:
MyClass() {
cout << "构造函数" << endl;
}
MyClass(const MyClass& myclass) {
cout << "拷贝构造函数" << endl;
}
~MyClass(){
cout << "析构函数" << endl;
}
void operator() () {
cout << "我的第二个进程开始啦" << endl;
cout << "我的第二个进程结束啦" << endl;
this->i = 2;
}
int i;
};
int main()
{
MyClass myclass;
myclass.i = 1;
thread myprocess_2(myclass);//这里是值传递
myprocess_2.join();
cout << myclass.i << endl;
std::cout << "Hello World!\n";
}
结果:
构造函数
拷贝构造函数
我的第二个进程开始啦
我的第二个进程结束啦
析构函数
1
Hello World!
析构函数