多进程和多线程的并发:
多进程和多线程的并发意思是在同一段时间内,多个进程或者线程一起执行,但是这些进程或者线程的执行并不是真正意义上在同一时刻执行,而是在不同的时间里执行,因为每个CPU在同一时间只能处理同一个进程的数据(除非一台电脑有多个CPU),所以说并发执行更像是操作系统通过时间片轮转的方式,将CPU时间分配给不同的进程,每个进程执行一小段时间后,操作系统会切换到另一个进程,这样循环进行的行为。
为什么要保证多线程和多进程并发执行的安全:
因为对于进程或者线程来说,一条指令的执行往往不是原子性的,因为高级语言中的一条语句往往会被编译为多条汇编语言比如i++,加入i=1,当一个线程执行i++时,操作系统将内存中的1取到寄存器里面,然后这时突然时间片结束,轮到下一个线程,下一个线程也执行i++的指令,这个时候,因为上一个线程还没有执行完上一条指令,所以内存中的i还是1,那么这条指令也会将内存中的1取出放入寄存器中,最后得到结果2写入对应的内存中,然后时间片结束,但是这个时候前面线程就开始执行刚刚未执行完毕的i++,因为这条指令会变为多条汇编指令,所以说它会执行下一条汇编指令,那么这个时候就会发生它将结果2写入内存,这样就出现了明明i++指令分别被两个线程执行了一次,按道理应该是3,但是结果是2,这就造成了错误,同样的问题还会存在于判断比如if(i>0)等一系列问题上,所以说要这样解决只能够让i++变成一条原子级别的操作(要么执行完,要么不执行),否则就会让程序的并发运行产生问题,而让这条指令变成原子操作就要用到锁了。
锁的作用
互斥:
◦ 锁最基本的作用是确保在任何时刻,只有一个线程可以访问特定的资源。这可以防止多个线程同时修改同一数据,从而避免数据损坏。
避免竞态条件:
◦ 竞态条件是指程序的执行结果依赖于多个线程或进程的执行顺序。锁可以确保在关键区域内,只有一个线程可以执行,从而避免竞态条件。
顺序控制:
◦ 锁可以用来控制线程执行的顺序,确保某些操作必须在其他操作之前或之后完成。
但是锁也会造成一定的效率降低,所以说锁所绑定的区域不是越大越好,也应该是合理才行