【并发编程】-- 多线程间并发与并行原理(一)

89 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

多线程之间的并发与并行原理

并发:

在计算机中运行多个任务的操作,高并发:看似同时有多个任务在计算机中执行,计算机中有多个任务,让这些任务交替在CPU上执行,只要交替的速度够快,就不会感知到任务间的切换,其实就是在有限的CPU中执行超过CPU数量的任务,任务之间交替执行,这涉及到CPU时间片。简单而言,在不同时间执行多个任务。

并行:

是一种特殊的并发,就是同一时间执行多个任务,而计算机中的并行的定义是在有限的CPU中执行任务,任务的个数正好等同于CPU的个数,则称为并行。

并发与并行带来的问题

首先涉及多个任务能同时进行时,不管是并发的分时执行,还是并行的同时执行,都会涉及到一个很严重的问题-资源争夺;如多个任务同时对一个变量进行加1操作,

伪代码如下:

int num = 1;
add(){
    num = num + 1;
}
//用多个线程执行分别add()

先查看num加1的汇编代码如下:

mov eax,[num的内存地址]  //将num值放入寄存器eax中
add eax,1 //对eax进行加1操作
mov [num的内存地址],eax  //将eax寄存器中的值放回到num地址中

从上述的汇编代码中可以看出变量加1的操作分为3步,加载到寄存器中;寄存器值加1;写回内存中。如果有多个任务同时执行呢?由于内存地址是相同的num值,因此理论上来说,有n个任务,值最后应该是n。 可能存在以下这种情况:

任务a把num的值加载到寄存器中,任务b刚好也将num的值加载到了寄存器中,两边都进行加1操作后,理论上等同于加了2,但由于任务的同时执行,导致两边同时加1后,任务a写回是1,任务b写回也是1,因此实际上操作等同于写了两次1。

上述情况是由于资源争夺导致的与预期不符的问题,这也称为并发问题。