信号量的定义:
它使用一个整型变量来累计唤醒次数,供以后使用。
原子操作:
是指一组相关联的操作要么都不间断地执行,要么都不执行。
下面有两种操作:down 和 up ,对一信号量执行down操作,则是检查其值是否大于0。若该值大于0,则将其值减1并继续,若该值为0,则进程将睡眠,而且此时down操作并未结束。(在检查数值,修改变量值以及可能发生的睡眠操作均作为一个单一的,不可分割的原子操作完成),保证一旦一个信号量操作开始,则在该操作完成或阻塞之前,其他进程均不允许访问该信号量。
刚开始看这段话有点懵,然后看了别人的回答;我觉得还挺好理解的:
(灵剑/知乎):
信号量就是在一个叫做互斥区的门口放一个盒子,盒子里面装着固定数量的小球,每个线程过来的时候,都从盒子里面摸走一个小球,然后去互斥区里面浪(?),浪开心了出来的时候,再把小球放回盒子里。如果一个线程走过来一摸盒子,得,一个球都没了,不拿球不让进啊,那就只能站在门口等一个线程出来放回来一个球,再进去。这样由于小球的数量是固定的,那么互斥区里面的最大线程数量就是固定的,不会出现一下进去太多线程把互斥区给挤爆了的情况。这是用信号量做并发量限制。