如果有两个或者两个以上的任务(进程 / 线程,并发的实体),去访问一个共享资源(硬件上面的,软件上的)。我们必须要保证这个共享资源的有序访问,否则会产生不可预知的后果
例子:
very_important_i = 5; // 共享资源
fun() {
very_important_i++;
}
有两个任务同时调用了fun()这个函数,那么请问very_important_i 最后的值是多少?
7 ----> 有可能
6 ----> 有可能,不是我们期望的结果
8 不可能
5 不可能
并发:任务(进程)在任意时刻都是有可能被暂停的
出现结果为6,就不是对共享资源的有序访问,是有问题的,所以我们需要对这个共享资源进行某一种方式的保护,以使它有序访问
“避免竞争”
并发可以提高cpu利用率,有可能造成竞争,造成共享资源的非法访问,程序行为异常....
解决方法:
能不能不要并发呢?
显然不可以
在保留并发的前提下,"避免竞争",在访问共享资源时,严格的串行
1. 信号量(semaphore)机制
信号量是什么?
信号量的作用是什么?
为什么需要信号量?
信号量的工作原理是什么?信号量(semaphore)是一种用于提供不同进程或者一个进程内部不同的线程间同步“避免竞争”的一种机制
进程/线程,任务:并发的实体
“同步”:并发的实体之间,相互等待,相互制约的一种机制
保证实体对共享资源有条件的访问
信号量就是为了保护共享资源,让共享资源有序访问的一种机制
信号量的目的:为了保护共享资源,使共享资源有序访问
信号量是程序界最高尚的一个东西,因为它不是为了自己而存在的,它是为了别人(它要保护的对象,共享资源)而存在的,"保镖"
2. 信号量是如何工作的
信号量是为了保护共享资源(大家都可以访问到的资源)有序的访问
信号量机制其实是程序员之间的一种约定,用来保护共享资源的
如:进程A和进程B,都需要访问一个共享资源“互斥设备”,那么我们可以使用一个信号量来表示能不能访问这个资源,每一个进程需要访问共享资源前,先去访问该信号量,如果能访问共享资源(信号量允许),则先把信号量设置为"NO",然后再去访问该共享资源,访问完共享资源,再把信号量设置为“YES”