而用户态提供的线程同步方法主要有:信号量、互斥量、锁。但是书上却只有这三者的用法,却没有给出这三者的区别,以及适用的场合。
求助高手,能否详细说说这三者的区别及适用场合呢?
如果有具体的实例代码最好了!
14 个解决方案
#1
老大已经很久没来了
#2
小生不才,僭越讲一下自己的理解。
你说的 互斥量 信号量 锁 不知道各自对应为何物?
以线程为例,pthread_mutex_t 底层对应 futex 系统调用,而futex对应内核 rw_semaphore
所以要了解它的特性的话,看看rw_semaphore就可以了。
信号量 不知是不是 sem_*的一系列api, 恩, 它的底层也是futex系统调用了。
反正都是,拿不到锁时会睡眠。
锁不知道具体是什么?
你说的 互斥量 信号量 锁 不知道各自对应为何物?
以线程为例,pthread_mutex_t 底层对应 futex 系统调用,而futex对应内核 rw_semaphore
所以要了解它的特性的话,看看rw_semaphore就可以了。
信号量 不知是不是 sem_*的一系列api, 恩, 它的底层也是futex系统调用了。
反正都是,拿不到锁时会睡眠。
锁不知道具体是什么?
#3
先帮顶
等老大
等老大
#4
差别简述如下:
信号量:允许使用它的代码休眠,持有锁的时间可相对较长。信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。
互斥体:信号量的特殊形式。只有0、1两种状态。互斥是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。
自旋锁:
优点:低开销;
注意:持有锁的时间应尽量短,不允许使用它的代码休眠
自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁)。
信号量:允许使用它的代码休眠,持有锁的时间可相对较长。信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。
互斥体:信号量的特殊形式。只有0、1两种状态。互斥是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。
自旋锁:
优点:低开销;
注意:持有锁的时间应尽量短,不允许使用它的代码休眠
自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁)。
#5
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。
3、信号量:为控制一个具有有限数量用户资源而设计。
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
至于mutex跟信号量这些可以参考
http://bbs.chinaunix.net/viewthread.php?tid=1255961
#7
<操作系统:设计与实现>(第三版)
网上有英文版的电子版,里面写的清清楚楚
网上有英文版的电子版,里面写的清清楚楚
#8
帮顶!!!
#9
我来说说
1.信号量和自旋锁一般都用于互斥.
2.信号量一般进行上下文切换,可休眠,但不可中断.
3.自旋锁可中断(中断临界区无获锁操作),不可休眠.
4.信号量互斥,一般临界区TIME(sem)较长; 自旋锁,一般临界区TIME(lock)较短.
1.信号量和自旋锁一般都用于互斥.
2.信号量一般进行上下文切换,可休眠,但不可中断.
3.自旋锁可中断(中断临界区无获锁操作),不可休眠.
4.信号量互斥,一般临界区TIME(sem)较长; 自旋锁,一般临界区TIME(lock)较短.
#10
自旋锁一般是不用于应用程序编程的。
线程间互斥用互斥锁,进程间互斥用记录锁。
信号量可以实现锁的效果,但信号量主要目的不是用于互斥。
线程间互斥用互斥锁,进程间互斥用记录锁。
信号量可以实现锁的效果,但信号量主要目的不是用于互斥。
#11
应该理解各种术语本质是什么,很多术语完全是因为对外国书籍翻译的偏差搞得很混乱!深入理解apue 2就可以得到答案。
#12
记得以前有个消息队列的问题,fetag因为拿不准直接去看内核实现后才给人回答, 做事好严谨,回答很对人责任。 但看上去这里不少人回答得有点不负责任啊。感觉自己都没有搞清楚哦!
#13
记得没错,应该是 1986年出的第一版.
#14
自己记录一下有价值的资料:
http://bbs.chinaunix.net/viewthread.php?tid=639557&extra=&page=1 自旋锁
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系统调用了。
反正都是,拿不到锁时会睡眠。
锁不知道具体是什么?
你说的 互斥量 信号量 锁 不知道各自对应为何物?
以线程为例,pthread_mutex_t 底层对应 futex 系统调用,而futex对应内核 rw_semaphore
所以要了解它的特性的话,看看rw_semaphore就可以了。
信号量 不知是不是 sem_*的一系列api, 恩, 它的底层也是futex系统调用了。
反正都是,拿不到锁时会睡眠。
锁不知道具体是什么?
#3
先帮顶
等老大
等老大
#4
差别简述如下:
信号量:允许使用它的代码休眠,持有锁的时间可相对较长。信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。
互斥体:信号量的特殊形式。只有0、1两种状态。互斥是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。
自旋锁:
优点:低开销;
注意:持有锁的时间应尽量短,不允许使用它的代码休眠
自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁)。
信号量:允许使用它的代码休眠,持有锁的时间可相对较长。信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。
互斥体:信号量的特殊形式。只有0、1两种状态。互斥是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了,在解锁。
自旋锁:
优点:低开销;
注意:持有锁的时间应尽量短,不允许使用它的代码休眠
自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁)。
#5
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)较短.
1.信号量和自旋锁一般都用于互斥.
2.信号量一般进行上下文切换,可休眠,但不可中断.
3.自旋锁可中断(中断临界区无获锁操作),不可休眠.
4.信号量互斥,一般临界区TIME(sem)较长; 自旋锁,一般临界区TIME(lock)较短.
#10
自旋锁一般是不用于应用程序编程的。
线程间互斥用互斥锁,进程间互斥用记录锁。
信号量可以实现锁的效果,但信号量主要目的不是用于互斥。
线程间互斥用互斥锁,进程间互斥用记录锁。
信号量可以实现锁的效果,但信号量主要目的不是用于互斥。
#11
应该理解各种术语本质是什么,很多术语完全是因为对外国书籍翻译的偏差搞得很混乱!深入理解apue 2就可以得到答案。
#12
记得以前有个消息队列的问题,fetag因为拿不准直接去看内核实现后才给人回答, 做事好严谨,回答很对人责任。 但看上去这里不少人回答得有点不负责任啊。感觉自己都没有搞清楚哦!
#13
记得没错,应该是 1986年出的第一版.
#14
自己记录一下有价值的资料:
http://bbs.chinaunix.net/viewthread.php?tid=639557&extra=&page=1 自旋锁
http://bbs.chinaunix.net/viewthread.php?tid=639557&extra=&page=1 自旋锁