免费注册 查看新帖 |

Chinaunix

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

[C] 【最终版 & 总结】自实现自旋锁 与 mutex,spinlock比较(结果令人吃惊) [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-07-29 15:58 |只看该作者
回复 19# 群雄逐鹿中原

这个是用来控制放弃时间片的周期,我试过,结果效果很差,大量的时间花费在sys 上(调用函数的开销,要陷入内核态)。
这部分代码是用来平衡用户态时间和sys的

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
22 [报告]
发表于 2011-07-29 16:00 |只看该作者
回复  群雄逐鹿中原

这个是用来控制放弃时间片的周期,我试过,结果效果很差,大量的时间花费在sys 上( ...
ydfgic 发表于 2011-07-29 15:58



    可否把测试数据贴一下看看?

论坛徽章:
0
23 [报告]
发表于 2011-07-29 16:01 |只看该作者
所以说没有正确使用spinlock也是很悲剧的,锁颗粒要细,以及最好不要用在经常锁等待的场合。
int-main 发表于 2011-07-29 15:47



    确实,实现这个版本的过程,我试了很多参数情况。
我觉得这个实现可以代替spinlock在一些情况,比如:链表指针的交换;一些小数据结构的访问,粒度足够细。
我觉得mutex碍眼,一个是它相对慢,第二依赖了pthread库。

论坛徽章:
0
24 [报告]
发表于 2011-07-29 16:07 |只看该作者
可否把测试数据贴一下看看?
群雄逐鹿中原 发表于 2011-07-29 16:00


这个是最终优化版本的:
real    0m0.408s
user    0m0.560s
sys     0m0.220s

这个是按你要求,去掉了那两句的:
real    0m1.411s
user    0m0.672s
sys     0m2.100s

这个是mutex:
real    0m1.774s
user    0m1.208s
sys     0m2.304s

这个是spinlock:
real    0m3.304s
user    0m6.564s
sys     0m0.004s

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
25 [报告]
发表于 2011-07-29 16:13 |只看该作者
可能有误解,我的意思是

  1. #define my_spinlock_lock(lock) do{  \
  2.     while(!__sync_bool_compare_and_swap(lock, 0, 1))    \
  3.     {   \
  4.           sched_yield();  \
  5.     }   \
  6. }while(0)
复制代码

论坛徽章:
0
26 [报告]
发表于 2011-07-29 17:35 |只看该作者
可能有误解,我的意思是
群雄逐鹿中原 发表于 2011-07-29 16:13


试了你说的情况,果然效果更好,sys稍有增加,但是这个时间降低,而且非常稳定
real    0m0.374s
user    0m0.460s
sys     0m0.280s

是mutex的5倍快
real    0m1.788s
user    0m1.164s
sys     0m2.368s

论坛徽章:
0
27 [报告]
发表于 2011-07-30 07:05 |只看该作者
再次更新:
直接在得不到锁的情况下,放弃时间片,增加了少许的sys耗时,但是降低了user耗时,而且最后结果 ...
ydfgic 发表于 2011-07-29 11:39



    已经调用了sched_yield,存在调度了,那还是自旋锁呀,信号量才对,呵呵

论坛徽章:
0
28 [报告]
发表于 2011-07-30 09:33 |只看该作者
过来学习一下!

论坛徽章:
0
29 [报告]
发表于 2011-07-30 10:47 |只看该作者
以前同事说,自旋锁是内急,去卫生间,但里面有人,急得团团转,所以叫自旋。

论坛徽章:
0
30 [报告]
发表于 2011-07-30 12:51 |只看该作者
已经调用了sched_yield,存在调度了,那还是自旋锁呀,信号量才对,呵呵
unbutun 发表于 2011-07-30 07:05


呵呵,确实不叫了。我的初衷确实是想让它自旋的,可是测试不给力啊,最后的版本追求的还是效率,就把它当做一个介于自旋锁和mutex之间的东西吧,对很细的粒度的加锁可以考虑这个实现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP