并发
一个程序执行多个独立任务,提高性能
单核cpu是通过(任务切换),即上下文切换,有时间开销
多核cpu(当核数>任务数),硬件并发
进程
运行起来的一个可执行程序(一段程序的运行过程)
资源分配的最小单位
线程
一个进程有且只有一个主线程,主线程执行main函数
主线程随着进程启动而执行
用来执行代码的,代码的一条执行通路
操作系统能调度的最小单位
C++11线程库
以往windows使用CreateThread()、——beginthread创建线程;linux使用pthread_create()创建线程,多线程代码不能跨平台,也可以使用pthread库来创建多线程,但是需要在不同平台作不同配置。
C++11语言增加了对多线程的支持,可以跨平台,不依靠操作系统
C++11创建线程(函数、类、lambda)
#include <thread>
thread(可调用对象);
join():主线程阻塞,等待子线程print执行完毕
detach():主线程不必等待子线程执行完毕,线程会驻留后台,由C++运行时库接管,并清理资源,此线程也称为守护线程。
joinable():判断是否能够成功使用join或者detach,返回true,可以使用join或者detach
//函数作为线程的可调用对象
//print可调用对象
//1.创建了一个线程,线程起点是print。
//2.线程print开始执行
thread myObj(print);
//主线程阻塞,等待子线程print执行完毕
//myObj.join();
//主线程不必等待子线程执行完毕
//一旦使用detach(),就不能使用join()
myObj.detach();
//joinable():判断线程是否能够成功join或者detach()
//返回true ,可以join或者detach
bool flag = myObj.joinable();
//类作为线程的可调用对象
class MyClass
{
public:
MyClass() {}
~MyClass() {}
void operator()() {
cout << " operator thread start" << endl;
//``````````````
cout << "operator thread end" << endl;
}
};
//线程调用
MyClass obj2;//类的构造函数
thread th(obj2);//类的默认拷贝构造函数
th.join();
bool fg = th.joinable();
cout << "类 标志 = " << fg<<endl;
//lambda表达式作为线程的可调用对象
auto lambdaFun = [] {
cout << " thread lambda s" << endl;
//``````````````
cout << " thread lambda e" << endl;
};
thread th22(lambdaFun);
th22.join();
线程需要避免的问题
建议不适用detach,只使用join,避免局部变量失效
线程id,使用std::this_thread::get_id()
std::ref(),不调用拷贝构造函数,=直接传的对象的引用,线程中的值更改能影响原来的值
使用独占智能指针作为线程参数,需要使用std::move()函数,只能使用join
使用成员函数作为线程参数传递
2.detach()的坑
传递基础类型,使用值传递
传递类对象(指针),避免隐式转换,在创建线程的同时显示构造新的临时变量,在线程函数的申明上,使用引用来传递