1.互斥量:
线程在取出头节点前必须要等待互斥量,如果此时有其他线程已经获得该互斥量,那么该线程将会阻塞在这里.只有等到其他线程释放掉该互斥量后,该线程才有可能得到该互斥量。互斥量从本质上说就是一把锁, 提供对共享资源的保护访问。
2.信号灯:
信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源。
进程可以根据它判定是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步。
(1)二值信号灯:信号灯的值只能取0或1,类似于互斥锁。 但两者有不同:
信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;
互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。
(2)计数信号灯:信号灯的值可以取任意非负值。
3.比较
(1)互斥量是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。
信号灯是一件可以容纳N人的房间,如果人不
满就可以进去,如果人满了,就要等待有人出来。
对于N=1的情况,称为binary semaphore。
(2)互斥量要由获得锁的线程来释放(谁获得,谁释放)。而信号灯可以由其它线程释放。
(3)初始状态可能不一样,互斥量的初始值是1 ,信号灯的初始值可能是1,2,3,4,5。