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