求助:linux 用户态 线程同步中信号量、互斥量、锁之间的区别?

时间:2021-08-24 15:14:30
看到内核中线程同步的方法主要有:自旋锁和信号量(当然还有其他一些方法)。他们之间的区别主要是在获取不到资源时,进程的行为不一样:自旋锁-等待、信号量-睡眠。

而用户态提供的线程同步方法主要有:信号量、互斥量、锁。但是书上却只有这三者的用法,却没有给出这三者的区别,以及适用的场合。
求助高手,能否详细说说这三者的区别及适用场合呢?
如果有具体的实例代码最好了!

14 个解决方案

#1


老大已经很久没来了

#2


小生不才,僭越讲一下自己的理解。

你说的 互斥量  信号量  锁  不知道各自对应为何物?

以线程为例,pthread_mutex_t 底层对应  futex 系统调用,而futex对应内核 rw_semaphore
所以要了解它的特性的话,看看rw_semaphore就可以了。

信号量 不知是不是 sem_*的一系列api, 恩, 它的底层也是futex系统调用了。

反正都是,拿不到锁时会睡眠。

锁不知道具体是什么?

#3


先帮顶
等老大

#4


差别简述如下:

    信号量:允许使用它的代码休眠,持有锁的时间可相对较长。信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。

    互斥体:信号量的特殊形式。只有0、1两种状态。互斥是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。

    自旋锁:
         优点:低开销;
         注意:持有锁的时间应尽量短,不允许使用它的代码休眠
    自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁)。

#5


引用楼主 qiuzhizhe 的帖子:
看到内核中线程同步的方法主要有:自旋锁和信号量(当然还有其他一些方法)。他们之间的区别主要是在获取不到资源时,进程的行为不一样:自旋锁-等待、信号量-睡眠。 

而用户态提供的线程同步方法主要有:信号量、互斥量、锁。但是书上却只有这三者的用法,却没有给出这三者的区别,以及适用的场合。 
求助高手,能否详细说说这三者的区别及适用场合呢? 
如果有具体的实例代码最好了!




1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 
3、信号量:为控制一个具有有限数量用户资源而设计。 
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 
至于mutex跟信号量这些可以参考
http://bbs.chinaunix.net/viewthread.php?tid=1255961

#7


<操作系统:设计与实现>(第三版)

网上有英文版的电子版,里面写的清清楚楚

#8


帮顶!!!

#9


我来说说
1.信号量和自旋锁一般都用于互斥.
2.信号量一般进行上下文切换,可休眠,但不可中断.
3.自旋锁可中断(中断临界区无获锁操作),不可休眠.
4.信号量互斥,一般临界区TIME(sem)较长; 自旋锁,一般临界区TIME(lock)较短.

#10


自旋锁一般是不用于应用程序编程的。
线程间互斥用互斥锁,进程间互斥用记录锁。
信号量可以实现锁的效果,但信号量主要目的不是用于互斥。

#11


应该理解各种术语本质是什么,很多术语完全是因为对外国书籍翻译的偏差搞得很混乱!深入理解apue 2就可以得到答案。

#12


记得以前有个消息队列的问题,fetag因为拿不准直接去看内核实现后才给人回答, 做事好严谨,回答很对人责任。 但看上去这里不少人回答得有点不负责任啊。感觉自己都没有搞清楚哦!

#13


引用 7 楼 fetag 的回复:
<操作系统:设计与实现>(第三版)

网上有英文版的电子版,里面写的清清楚楚



记得没错,应该是 1986年出的第一版.

#14


自己记录一下有价值的资料:

http://bbs.chinaunix.net/viewthread.php?tid=639557&extra=&page=1   自旋锁

#1


老大已经很久没来了

#2


小生不才,僭越讲一下自己的理解。

你说的 互斥量  信号量  锁  不知道各自对应为何物?

以线程为例,pthread_mutex_t 底层对应  futex 系统调用,而futex对应内核 rw_semaphore
所以要了解它的特性的话,看看rw_semaphore就可以了。

信号量 不知是不是 sem_*的一系列api, 恩, 它的底层也是futex系统调用了。

反正都是,拿不到锁时会睡眠。

锁不知道具体是什么?

#3


先帮顶
等老大

#4


差别简述如下:

    信号量:允许使用它的代码休眠,持有锁的时间可相对较长。信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。

    互斥体:信号量的特殊形式。只有0、1两种状态。互斥是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。

    自旋锁:
         优点:低开销;
         注意:持有锁的时间应尽量短,不允许使用它的代码休眠
    自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁)。

#5


引用楼主 qiuzhizhe 的帖子:
看到内核中线程同步的方法主要有:自旋锁和信号量(当然还有其他一些方法)。他们之间的区别主要是在获取不到资源时,进程的行为不一样:自旋锁-等待、信号量-睡眠。 

而用户态提供的线程同步方法主要有:信号量、互斥量、锁。但是书上却只有这三者的用法,却没有给出这三者的区别,以及适用的场合。 
求助高手,能否详细说说这三者的区别及适用场合呢? 
如果有具体的实例代码最好了!




1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 
3、信号量:为控制一个具有有限数量用户资源而设计。 
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 
至于mutex跟信号量这些可以参考
http://bbs.chinaunix.net/viewthread.php?tid=1255961

#6


#7


<操作系统:设计与实现>(第三版)

网上有英文版的电子版,里面写的清清楚楚

#8


帮顶!!!

#9


我来说说
1.信号量和自旋锁一般都用于互斥.
2.信号量一般进行上下文切换,可休眠,但不可中断.
3.自旋锁可中断(中断临界区无获锁操作),不可休眠.
4.信号量互斥,一般临界区TIME(sem)较长; 自旋锁,一般临界区TIME(lock)较短.

#10


自旋锁一般是不用于应用程序编程的。
线程间互斥用互斥锁,进程间互斥用记录锁。
信号量可以实现锁的效果,但信号量主要目的不是用于互斥。

#11


应该理解各种术语本质是什么,很多术语完全是因为对外国书籍翻译的偏差搞得很混乱!深入理解apue 2就可以得到答案。

#12


记得以前有个消息队列的问题,fetag因为拿不准直接去看内核实现后才给人回答, 做事好严谨,回答很对人责任。 但看上去这里不少人回答得有点不负责任啊。感觉自己都没有搞清楚哦!

#13


引用 7 楼 fetag 的回复:
<操作系统:设计与实现>(第三版)

网上有英文版的电子版,里面写的清清楚楚



记得没错,应该是 1986年出的第一版.

#14


自己记录一下有价值的资料:

http://bbs.chinaunix.net/viewthread.php?tid=639557&extra=&page=1   自旋锁