并发编程与底层原理(并发编程常用术语通俗解释)
并发编程与底层原理(并发编程常用术语通俗解释)把正在运行的多个任务,分割成小块,分配给多个线程同时运行。并发包含的方式通俗地讲,程序能够同时处理多个任务就称为并发。在谈论并发的时候,有的朋友总会想起多线程,这里有必要声明一下,并发包含多线程,多线程是并发的一种实现方式。下图是我所了解的并发方式
今天来讲讲并发编程常用术语的通俗解释
1 并发同时做多件事情。
这个解释直接表明了并发的目的,例如编写客户端程序,在后台查询数据库数据时,需要对用户的输入请求进行响应;在编写服务的程序时,可以同时响应多个用户的请求。
可以说只要产品需要同时做多件事情,那么就需要并发。
通俗地讲,程序能够同时处理多个任务就称为并发。
在谈论并发的时候,有的朋友总会想起多线程,这里有必要声明一下,并发包含多线程,多线程是并发的一种实现方式。
下图是我所了解的并发方式
并发包含的方式
2 并行把正在运行的多个任务,分割成小块,分配给多个线程同时运行。
现代计算机一般都是多核的,把所有任务只交给一个核显然是不合理的。
举例来说,如果计算机是4核的,有4个任务要同时执行,则每个核跑一个任务。
3 同步&异步同步,按顺序执行,发起请求后,需要等待结果返回后才返回。
而对于线程间同步,线程的运行顺序并不是有序的,它是由操作系统进行管理的,想要数据保持一致,线程必须挂起并等待其他线程执行完毕。
例如,如果两个线程试图同时写入同一个变量,结果是不可知的,所以必须使用同步。而实现同步的方式可以用互斥量。
异步,不按顺序执行,发起请求后,可以立即返回,不需要等待结果返回后才返回。
以下是关于多线程的一些术语解释
4 高级接口&低级接口在C 标准库、Qt或其它语言的标准库都提供了并行开发的高级接口,我们应尽量避免使用低级接口,使用高级接口可以很方便的处理并行开发,且上手简单,逻辑清晰,性能高效。
高级接口一般有像标准库中的future、promise,Qt中的QFuture、QFutureWatcher等。低级接口有thread、QThread、QRunnable、QMutex等。
如果你还在使用低级接口,若不是什么必须条件,那最好切换使用高级接口吧。
5 线程安全线程调用函数,如果这个函数只修改局部变量,或是有序修改共享区数据,则我们说这个函数就是线程安全的。如果是类中的方法,我们就说这个类是线程安全的。
多线程之所以复杂,是因为要同时访问或修改共享资源,所以可以认为如果函数不对共享资源操作,或安全操作,则该函数是线程安全的。
6 互斥量当多个线程同时访问公共资源时,可以使用互斥量,谁先抢到锁,谁就可以访问公共资源,待锁释放后,其它线程才可以再次抢锁。
下图是A先获得了锁进入房间,BCD都必须在门外等候,只有A从房间出来,释放锁后,BCD才可以重新抢占。
互斥量
7 信号量信号量是更一般化的互斥量。一个互斥量只能被锁定一次,但是一个信号量可以被锁住多次。信号量通常用于保护一定数量的相同资源。
电影院选座
信号量的一个很好的例子是电影院选座。
- 一个信号量被初始化为电影院里的座位数量,如上图为5个座位数。
- 第1个人获取座位数1(可用信号量个数变为4),成功(黄色)
- 第2个人获取座位数2(可用信号量个数变为2),成功(蓝色)
- 第3个人获取座位数3,失败,因为可用的信号量已经剩余2个了。
- 如果第3个人想要获取到3个座位,则必须等待其他人释放掉信号量个数,可用的信号量数大于等于3才可以
信号量可以运用在餐厅订座,车票订座等场景
8 死锁两个或两个以上的线程,彼此竞争资源而造成的一种彼此阻塞的现象。
死锁
蓝色的钥匙被锁到箱子A中,黄色的钥匙被锁到箱子B中,出现死锁
欢迎关注
小豆君编程分享
知乎:小豆君编程分享