进程线程概念:进程相当于一个可执行的程序,一个进程里能够有多个线程,在嵌入式程序里,创建了多个线程。
实现并发的手段:1.创造多个进程,相当于同时打开多个可执行文件。
2.创造一个进程,但是这一个进程中包含多个线程,类似于嵌入式程序中的创建多个线程一起跑。
多进程并发和多线程并发的优缺点
优点
1.线程的启动速度更快,更轻量级
2.系统资源开销更少,执行速度更快
缺点
存在线程共享数据一致性问题。
单线程调用:
调用函数版本:
线程创建:调用API创建一个线程,thread是一个类,join()会阻塞主线程,主线程会阻塞,直到子线程执行。
而detch(),不会阻塞主线程,主线程和子线程一起执行,但是当主线程结束的时候,子线程也一起结束。
joinable()会判断是否现在能够创建线程。
调用类版本:
需要在类中定义一个重载运算符。。
注意:不要在子线程中调用从主线程中传入的子线程的主线程的局部参数。因为一旦主线程detach()调用子线程的话,主线程一旦释放那个局部参数的话,子线程中就不能直接调用了。(针对于指针和引用的操作)
lambda表达式:只调用一次的函数。
例子 auto (函数名) = []{执行内容} 只是把函数内容换成 lambda表达式的内容。
创建线程引入变量
普通方式,用join。
注意点:当引用detach调用开始线程的时候,其中例子中的引用i(ainty)实际上是复制了一个变量(跟类中的引用情况不一样),但是用指针的时候,是直接引用了那个变量的地址。 ——注意用detach的时候,主线程变量改变,子线程变量也一样会改变。最好避免传指针和引用。
使用deatch()调用,变量不要引用,字符串的话,使用string的类。
当要在deatch()调用,调用类的时候,也需要像类似于string一样的,将变量转换成一个类。
创建线程的时候,用构造临时对象的方法传递参数是可行的。
若传递int这种类型的简单参数,建议直接传递。
若传递类对象,避免隐式转换,直接在创建线程这一行将构建出临时对象,如(const A &pmybuf),在函数参数中,需要用引用来接。
vector (向量)作用:是一个能够封装动态大小数据的顺序容器,可以简单的认为它是一个可以存放任意类型的动态数组。
用法:vector<类型>标识符{最大容量,初始所有值}
list也是类似于vector的一个容器,list:频繁的按顺序插入和删除数据时效率高。vector:容器随机的插入和删除数据效率高。
使用list同样需要加入list的头文件。
多线程的创建方法:首先创建一个容器vector <thread> gree,把thread放入一个容器里进行管理。使用vector需要增加
#include <vector>的头文件
在单线程中调用类中的函数作为线程的入口函数
在类中创建一个函数,其中list类似于vector。
在main中创建一个线程,并调用,注意需要加上引用类,因为创建线程以后,同时会创建一个新的对象。