信号量:
是用来解决进程/线程之间的同步和互斥问题的一种通信机制,是用来保证两个或多个关键代码不被并发调用。
信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个资源,因此S的值减1;当S<0时,表示已经没有可用资源,S的绝对值表示当前等待该资源的进程数。请求者必须等待其他进程释放该类资源,才能继续运行。而执行一个V操作意味着释放一个资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
也就是说信号量通过PV操作同步解决了进程/线程对临界资源利用的冲突问题;
信号量是选择睡眠的方式来对共享工作停止访问的。
互斥锁:
互斥锁同样也是对线程间(不能对进程)同步和互斥的一种另一种机制。
互斥锁更多的是强调对共享资源的锁定作用,当一个线程占用了当前共享资源,使用互斥锁将其lock住之后,其他线程就无法访问,必须等到unlock之后,其他线程才能利用共享资源里面的内容;
也就是说互斥锁通过对共享资源的锁定和互斥解决利用资源冲突问题;
互斥锁是选择睡眠的方式来对共享工作停止访问的。
自旋锁:
是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
以上总结几点,互斥锁与信号量的区别:
1、信号量一般以同步的方式对共享资源进行控制,而互斥锁通过互斥的方式对共享资源对其进行控制;
2、信号量可以对进程的共享资源进行控制,而互斥锁不行;
3、信号量的值为非负整数,而互斥锁的值只能为0或1;
4、互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到;
自旋锁与互斥锁的区别:
1、因为自旋锁不会引起调用者睡眠,所以效率比较高
2、自旋锁比较适用于锁使用者保持锁时间比较短的情况。
3、自旋锁容易造成死锁,所以需要安全使用它;