快捷搜索:  汽车  科技

并发编程与底层原理(并发编程常用术语通俗解释)

并发编程与底层原理(并发编程常用术语通俗解释)把正在运行的多个任务,分割成小块,分配给多个线程同时运行。并发包含的方式通俗地讲,程序能够同时处理多个任务就称为并发。在谈论并发的时候,有的朋友总会想起多线程,这里有必要声明一下,并发包含多线程,多线程是并发的一种实现方式。下图是我所了解的并发方式

今天来讲讲并发编程常用术语的通俗解释

1 并发

同时做多件事情。

这个解释直接表明了并发的目的,例如编写客户端程序,在后台查询数据库数据时,需要对用户的输入请求进行响应;在编写服务的程序时,可以同时响应多个用户的请求。

可以说只要产品需要同时做多件事情,那么就需要并发。

通俗地讲,程序能够同时处理多个任务就称为并发。

在谈论并发的时候,有的朋友总会想起多线程,这里有必要声明一下,并发包含多线程,多线程是并发的一种实现方式

下图是我所了解的并发方式

并发编程与底层原理(并发编程常用术语通俗解释)(1)

并发包含的方式

2 并行

把正在运行的多个任务,分割成小块,分配给多个线程同时运行。

现代计算机一般都是多核的,把所有任务只交给一个核显然是不合理的。

举例来说,如果计算机是4核的,有4个任务要同时执行,则每个核跑一个任务。

3 同步&异步

同步,按顺序执行,发起请求后,需要等待结果返回后才返回。

而对于线程间同步,线程的运行顺序并不是有序的,它是由操作系统进行管理的,想要数据保持一致,线程必须挂起并等待其他线程执行完毕。

例如,如果两个线程试图同时写入同一个变量,结果是不可知的,所以必须使用同步。而实现同步的方式可以用互斥量。

异步,不按顺序执行,发起请求后,可以立即返回,不需要等待结果返回后才返回。

以下是关于多线程的一些术语解释

4 高级接口&低级接口

在C 标准库、Qt或其它语言的标准库都提供了并行开发的高级接口,我们应尽量避免使用低级接口,使用高级接口可以很方便的处理并行开发,且上手简单,逻辑清晰,性能高效。

高级接口一般有像标准库中的future、promise,Qt中的QFuture、QFutureWatcher等。低级接口有thread、QThread、QRunnable、QMutex等。

如果你还在使用低级接口,若不是什么必须条件,那最好切换使用高级接口吧。

5 线程安全

线程调用函数,如果这个函数只修改局部变量,或是有序修改共享区数据,则我们说这个函数就是线程安全的。如果是类中的方法,我们就说这个类是线程安全的。

多线程之所以复杂,是因为要同时访问或修改共享资源,所以可以认为如果函数不对共享资源操作,或安全操作,则该函数是线程安全的。

6 互斥量

当多个线程同时访问公共资源时,可以使用互斥量,谁先抢到锁,谁就可以访问公共资源,待锁释放后,其它线程才可以再次抢锁。

下图是A先获得了锁进入房间,BCD都必须在门外等候,只有A从房间出来,释放锁后,BCD才可以重新​抢占。

并发编程与底层原理(并发编程常用术语通俗解释)(2)

互斥量

7 信号量

信号量是更一般化的互斥量。一个互斥量只能被锁定一次,但是一个信号量可以被锁住多次。信号量通常用于保护一定数量的相同资源。

并发编程与底层原理(并发编程常用术语通俗解释)(3)

电影院选座

信号量的一个很好的例子是电影院选座。

  • 一个信号量被初始化为电影院里的座位数量,如上图为5个座位数。
  • 第1个人获取座位数1(可用信号量个数变为4),成功(黄色)
  • 第2个人获取座位数2(可用信号量个数变为2),成功(蓝色)
  • 第3个人获取座位数3,失败,因为可用的信号量已经剩余2个了。
  • 如果第3个人想要获取到3个座位,则必须等待其他人释放掉信号量个数,可用的信号量数大于等于3才可以

信号量可以运用在餐厅订座,车票订座等场景

8 死锁

两个或两个以上的线程,彼此竞争资源而造成的一种彼此阻塞的现象。

并发编程与底层原理(并发编程常用术语通俗解释)(4)

死锁

蓝色的钥匙被锁到箱子A中,黄色的钥匙被锁到箱子B中,出现死锁

欢迎关注

小豆君编程分享

知乎:小豆君编程分享

猜您喜欢: