当前位置:  技术问答>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系统调用了。

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

锁不知道具体是什么?


|
差别简述如下:

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

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

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


|
(第三版)

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

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

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

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

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 紧急求助java多线程编程!!!!!!!!!!!!!
  • 求助,线程的回收
  • socket实现多文件并发传输,求助多线程实现问题?
  • 求助Linux下怎样查看线程状态?
  • 线程内部的errno问题求助
  • Opengl Linux多线程 求助
  • 求助多线程问题
  • 求助:Linux下线程编程的问题~~~~~~~~~~~~~~~~~~~`
  • 求助:关于单线程recv时的超时问题
  • 求助!Linux下socket编程,服务端与多线程的问题
  • ■■求助■■ 如何查看一个进程拥有的线程数量???
  • 【求助】在主线程里如何终止子线程的执行?
  • 求助!Linux多线程问题
  • 求助!!!多线程+多个epoll_wait问题
  • 求助!pthread与Win32 API线程库的对应问题
  • 【求助】如何使运行中的线程挂起?
  • 求助linux下socket多线程编程的例子(C语言写的)
  • (100分求助)用内核线程对用户进程操作(大侠/虾们出手了)
  • 求助!关于多线程下数据库操作的问题,请大家帮忙看看
  • MM求助:怎样多线程下载http://java.sun.com上的东东? 用http方式,谢谢了.
  • 高分求助高分求助高分求助高分求助高分求助高分求助
  • 怎样读取HZK24S前十区的内容啊???求助求助 iis7站长之家
  • 紧急求助!紧急求助!
  • 【求助】iplanet问题,求助高手解答!
  • 菜鸟求助,solaris下计算问题求助
  • 【求助】SOS紧急求助..............极为简单的问题...跪求....
  • 高分求助啊!求助SUSE 10.0 不能上网.
  • 急急急急急急急啊,紧急求助啊!!!!!满分求助啊!!!!!!
  • 求助:linux下 vim的配置(高分求助)
  • red hat怎么安装gcc啊!总是出错,求助求助啊!!!yum源怎么改啊!!
  • 求助~~求助 ~~linux文件读写问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3