信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。当信号量为单值信号量是,也可以完成一个资源的互斥访问。有名信号量:可以用于不同进程间或多线程间的互斥与同步;无名信号量,用于进程体内各线程间的互斥和同步,基于内存的信号量。
互斥锁(又名互斥量)强调的是资源的访问互斥:互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。有的时候锁和信号量会同时使用的” 也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后再进行自己下面的步骤,这个任务并不一定是锁定某一资源,还可以是进行一些计算或者数据处理之类。而线程互斥量则是“锁住某一资源”的概念,在锁定期间内,其他线程无法对被保护的数据进行操作。在有些情况下两者可以互换。
有的时候锁和信号量会同时使用的。
信号量用在多任务线程同步,只有信号量的value大于0,其他等待信号量的线程才可以用,并且每个等待信号的任务得到信号 之后对value减一
当信号量的value为0的时候,其他等带信号量的线程进入阻塞状态。
互斥锁相当于2值信号量,一个资源对于多任务,只有能用或不能使用2个选择
信号量用在多任务线程之间的同步,一个线程达成了某个事件就通过信号量通知其他线程
互斥锁用在多任务线程的互斥,保证资源的互斥访问
信号量和互斥锁一般都用于多线程编程中,不过二者应用场景(线程间关系不同),
互斥锁保障同一时间只有一个线程获得,其它的不能获得,如果要根据互斥锁获取与否执行的化,则可以保证同一时间只有获得锁的线程能够执行。
信号量则不保证唯一获得关系,只要注册了使用信号量的线程,都可以在信号量发生变化时获得相应信息,这样可以据此进行相应处理,所以它只是一个信号,具体如何处理要看相关线程(进程)中的具体处理。
1、二者的区别:互斥量用于线程的互斥,信号量用于线程的同步。
2、用法:互斥量值只能为0/1,就是只能指定两个线程互斥或者不互斥
信号量的值可以为整数,只有信号量的值大于0时此线程才能被访问
3、应用场景:信号量用来协调不同进程间的数据对象的
互斥量用于指定两个进程之间的关系