一、线程运行的开始和结束
- 整个进程是否执行完毕的标志是 主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了
- 此时,如果其他子线程还没有执行完毕,那么这些子线程也会被操作系统强行终止
1. 创建线程
- join()函数 阻塞主线程,等待子线程执行完毕,然后子线程和主线程汇合,继续执行主线程
std::thread obj(MyPrint);
obj.join();
- detach()函数 线程分离,主线程不和子线程汇合,独立执行
std::thread obj(MyPrint);
obj.detach();
- joinable()函数 判断是否可以成功使用 join() 或者 detach()函数(返回值为true表示可以使用join()或者detach() ; 返回false 表示不能join() 或者 detach() )
std::thread obj(MyPrint);
if(obj.joinable())
{
}
else
{
}
二、其他创建线程的手法
1. 用类对象作为可调用对象
#include "stdafx.h"
#include <iostream>
#include <thread>
using namespace std;
class Test
{
private:
int m_i;
public:
Test(int i) :m_i(i) {
cout << "构造函数被执行" << endl;
}
Test(const Test &test) :m_i(test.m_i) {
cout << "拷贝构造函数被执行" << endl;
}
void operator()()
{
cout << "线程开始了:" << m_i << endl;
cout << "线程结束了:" << m_i << endl;
cout << "线程结束了:" << m_i << endl;
cout << "线程结束了:" << m_i << endl;
}
};
int main()
{
int i = 6;
Test test(i);
thread obj(test);
obj.detach();
cout << "I Love China" << endl;
system("pause");
return 0;
}
2. 用lambda表达式
int main()
{
auto myLambda = []() {
cout << "线程开始了:" << endl;
cout << "线程结束了:" << endl;
};
thread obj(myLambda);
obj.join();
cout << "I Love China" << endl;
system("pause");
return 0;
}