type
status
date
slug
summary
tags
category
icon
password
Email
文章首发于我的个人博客:欢迎大佬们来逛逛
进行与线程
多线程是指多个线程并发执行的过程。
进程与线程的关系:
- 进程是一个独立运行的应用程序
- 线程是指进程内独立执行的一个单元,一个进程中可能有多个线程。
C++中如何实现多线程
使用
#include <thread>
头文件,里面定义了很多的线程函数。其中,使用
thread
创建一个线程.比如我有两个函数,分别是:
- print1是主线程。
- 下面四个函数分别是子线程。
现在我们想让他们四个同时执行?如何操作。
- 首先来创建线程对象:
thread
用作线程对象类型,然后传递一个函数指针(以模板形式)给到这个对象,则这个对象就是一个线程对象。我们将这三个子线程分别为三个不同的线程对象。print为主线程。
- 创建完成后我们使用
join
来将子线程添加到主线程中:
- 然后运行,就会发现,三个子线程和主线程同时结束,说明多线程有效。
观察到细节:
- 三个子线程都有一个等待两秒的功能,如果不是多线程,则很容易想到单纯的运行这四个函数可能需要6秒多才完成。
- 但是他们四个是同时完成的,即只用了两秒。
- 并且我们没有限制线程之间的执行顺序,因此他们的顺序是任意的。
join
函数就是将子线程加入到主线程,然后和主线程一起执行完毕。还有个
detach
函数:- detach: 子线程和主线程各自玩个的,等待主线程执行完毕则停止。
则会出现什么?
- 程序立刻结束,我管你子线程执行了没有,只要我的主线程结束了,则程序就结束。因此程序直接执行主线程函数,而不会执行三个子线程。
joinable
:对线程是否可以join和detach操作进行判断。即一个线程只能进行一次join或者detach操作,如果你写了很多的代码,明明已经join过一次了,但是忘记了,因此又join了一次,这时就会报错
!!!该函数在可以 join 或 detach 的时候返回true,否则返回false。
因此常见的避免错误的方式:
创建线程的多种方式
thread类型的构造函数是怎样的呢? 它可以构造什么样的线程函数对象呢?
Fn
:接受一个函数指针。
Args
:接受函数的参数。
无参函数
这是最简单的创建线程的方式:
lambda表达式
常成员函数
- 普通内置类型:int
- 常引用:const string& ; const int&
- 常指针:const int*
- 都可以直接传递
not常成员引用函数
- not常引用: 如果是
不带const
的引用类型,则必须使用std::ref
修饰,否则会报错:
- not常指针:不会报错。
智能指针
传递智能指针 unique_ptr 需要加
move
移动,因为unique_ptr只允许存在一份,但是移动后本地将消失。仿函数
直接传递即可。
类的普通成员函数
函数指针的形式,先传递类名所对应的
函数地址
,然后再传递类对象
。综合测试
- 作者:Yuleo
- 链接:https://www.helloylh.com/article/multithread1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。