免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: vulturecc
打印 上一主题 下一主题

关于互斥量的问题 pthread_mutex_trylock函数 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-05-10 16:33 |只看该作者
回复 10# chong232


    说实话,还真有区别,
第一, while(pthread_mutex_trylock(&mutex)) 这种写法适用于能很快得到锁的情况,假如另一个线程干的活比较多,不能立即释放锁,那么建议不要采取这种写法,因为这种写法相当于不停的轮询,他是占用CPU时间的,直到他的时间片消耗完了,调度器选择另一个线程运行,如果另一个线程占用锁时间比较长,那么就直接让本线程睡眠,让调度器选择另一个线程运行。
第二,考虑到信号。pthread_mutex_lock()这种写法,如果被信号中断了,取决于具体实现,比如你注册信号处理函数时是否指定了restart标志,如果有,那么该函数被信号打断后,执行完信号处理程序,操作系统会自动重起被中断的函数,也就是说会继续阻塞,但是目前来看,不管是trylock还是直接lock,被信号打断后,这2个函数都重起

第三,和mutex的类型有关,可以避免死锁。如果mutex的类型为PTHREAD_MUTEX_RECURSIVE,而当前线程已经加了锁,那么pthread_mutex_lock将死锁。后一种写法会跳出while循环,并将锁的计数加1,还有其他的区别,不说了。

论坛徽章:
0
12 [报告]
发表于 2012-05-16 13:26 |只看该作者
用while就类似 spinlock了,你自己去搜索 spinlock 和 mutex lock的区别。

一般来说 spinlock用在 临界区耗时比较小的场合,性能相比 那种进行休眠的mutex lock要好,因为进程切换一下代价相对来说比较大的。

论坛徽章:
0
13 [报告]
发表于 2012-05-24 03:37 |只看该作者
hmsghnh 发表于 2012-05-16 13:26
用while就类似 spinlock了,你自己去搜索 spinlock 和 mutex lock的区别。

一般来说 spinlock用在 临界区 ...



如果是线程之间呢?使用while循环求锁 还是 阻塞求锁?我选后者。

论坛徽章:
0
14 [报告]
发表于 2012-05-24 03:42 |只看该作者
virusest 发表于 2012-05-10 16:33
回复 10# chong232



其实这个问题来源于:memcached的源代码里为何使用while(pthread_mutext_trylock())而不是用pthread_mutext_lock()

你回答的1说法没错,但这不能解释为什么memcached这么作
2,关于信号的没看明白,但应该跟我们要解释的问题无关
3, 唯一可能的memcahced使用while()形式的原因
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP