linux下信号量和互斥锁的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下信号量和互斥锁的区别相关的知识,希望对你有一定的参考价值。

参考技术A 信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。
而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。
有的时候锁和信号量会同时使用的。我记得以前做的一个项目就是既有semtake,又有lock。
参考技术B 信号量与互斥锁之间的区别:
1.
互斥量用于线程的互斥,信号量用于线程的同步。
这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
2.
互斥量值只能为0/1,信号量值可以为非负整数。
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。
3.
互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

6.5 linux内核互斥锁

参考技术A 互斥锁是信号量的特例。信号量的初始值表示有多少个任务可以同时访问共享资源,如果初始值为1,表示只有1个任务可以访问,信号量变成互斥锁(Mutex)。
1.同一时间只能有一个任务持有互斥锁,而且只有这个任务可以对互斥锁进行解锁。
2.使用中的互斥锁是不能被重新初始化的。
3.并且互斥锁不能用于中断上下文。

mutex结构体

mutex初始化

mutex加锁

mutex解锁

1、mutex初始化
a) 动态初始化

b) 静态初始化

2、mutex加锁

3、mutex解锁

drivers/input/evdev.c

以上是关于linux下信号量和互斥锁的区别的主要内容,如果未能解决你的问题,请参考以下文章

信号量与互斥锁的区别

关于条件变量与互斥锁信号量的区别,Linux下线程同步的几种方法

6.5 linux内核互斥锁

Linux 线程同步都有哪些方法?

LiteOS 互斥锁机制

互斥锁,信号量,条件变量,读写锁