免费注册 查看新帖 |

Chinaunix

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

[C] 谁能帮我解释这个无锁链表是怎么实现的,帮我分析一下 [复制链接]

论坛徽章:
2
处女座
日期:2014-02-11 17:53:48未羊
日期:2014-12-31 15:13:36
1 [报告]
发表于 2014-11-27 00:07 |显示全部楼层
1.list->root.next的操作实际上起到了读锁的作用,保证同一时刻只有一个在读
2.list->tail对写操作进行序列化,虽然不是很完全,但是保证了写操作的原子性
3.写操作*ptr=node是原子的,读操作可能重置list->tail也是原子的
4.每当“锁”失败时,用自旋来等待
5.这个链表其实就是用了锁,根本不能叫无锁链表

@codechurch 18楼说的lock-free容器是啥?

论坛徽章:
2
处女座
日期:2014-02-11 17:53:48未羊
日期:2014-12-31 15:13:36
2 [报告]
发表于 2014-11-27 13:00 |显示全部楼层
回复 20# shan_ghost


嗯,你说的都对
但是楼主的问题不是ABA
楼主的代码对get加了锁,根本没有ABA啥事

论坛徽章:
2
处女座
日期:2014-02-11 17:53:48未羊
日期:2014-12-31 15:13:36
3 [报告]
发表于 2014-11-27 16:56 |显示全部楼层
回复 22# shan_ghost


呵呵,你一边歇着去
你看不出来怎么保证只有一个在读是吧,我来告诉你

get_one和get函数的第一行
__sync_lock_test_and_set(&(list->root.next), NULL);
会将list->root.next置NULL,不管链表里还有多少项,在置回去之前,下一个get只能得到NULL返回失败
这就保证了只有一个get在操作

不懂装懂确实惹人恶心

论坛徽章:
2
处女座
日期:2014-02-11 17:53:48未羊
日期:2014-12-31 15:13:36
4 [报告]
发表于 2014-11-28 14:19 |显示全部楼层
其实吧,看到标题写着“无锁”就进来贴一大段“科普”也是挺烦人的
进来这讨论的人谁不知道那点常识
关键还搞错概念误导别人就不好了

把lock-free解释成“极小粒度”的锁也真是醉了
lock-free的概念请看12楼

另外read-copy-update只是lock-free的一种形式,不要把两者画等号
实际上如果使用GC的话,queue和stack都是可以lock-free的

@zylthinking 的代码,如果限定一个读线程并使用get_one,确实是lock-free的

论坛徽章:
2
处女座
日期:2014-02-11 17:53:48未羊
日期:2014-12-31 15:13:36
5 [报告]
发表于 2014-11-28 14:38 |显示全部楼层
说缺陷的话其实也不是什么大缺陷
无非就是一个put没完成会导致无法get
但是想想就算没有这个问题,链表空时get也会拿到NULL
所以还是需要等待**的机制,这个就看程序的实现了

论坛徽章:
2
处女座
日期:2014-02-11 17:53:48未羊
日期:2014-12-31 15:13:36
6 [报告]
发表于 2014-11-28 22:07 |显示全部楼层
回复 38# zylthinking

确实get+next的返回值更明确一些,能正确区分 链表空/put未完成 这两种状态
而且多读情况下,也基本是lock-free了,唯一会被“阻塞”的操作就是next返回空的情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP