免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4474 | 回复: 8
打印 上一主题 下一主题

[CPU及多核] 关于 多核 多读一写 无锁链表,请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-03 20:22 |只看该作者 |倒序浏览
其他很多cpu读链表,单独一个cpu修改链表, 赋值操作为原子操作。

比如单向链表: a->c->NULL

负责修改的cpu插入b节点:
b->next = c;
smp_wb();//保证上面先执行
a->next = b;

其他的只读链表的cpu
cur = a;
cur = cur->next;
visit(cur); //可能为b
mp_read_barrier_depends();
cur = cur->next;//如果为b,是否一定为c
visit(cur);

请问, 这样有没有问题, 不知道链表可不可以看成是data dependency, 如果是,这样写,除非读不到b (a->next==c),否则(a->next == b) b->next就一定是c。

多谢。


上面的代码是为了说明方便,实际上mp_read_barrier_depends() 定义为do{}while(0) ,读链表的操作为一个for循环
for(...)
    visit(cur);

论坛徽章:
0
2 [报告]
发表于 2014-06-01 21:30 |只看该作者
没有问题,据说那款有问题的cpu早已停产了。

论坛徽章:
0
3 [报告]
发表于 2014-06-03 17:11 |只看该作者
插入应该没问题,删除怎么办?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
4 [报告]
发表于 2014-06-03 18:29 |只看该作者
看起来好像没问题~

论坛徽章:
0
5 [报告]
发表于 2014-07-02 19:48 |只看该作者
本帖最后由 yiifburj 于 2014-08-23 14:38 编辑
mnipxh 发表于 2014-06-03 17:11
插入应该没问题,删除怎么办?

删除等一会再释放内存。
一个办法是
void wmbdd_barrier(void *unused)
{
        smp_mb();
}

smb_mb();
preempt_disable();
smp_call_function(wmbdd_barrier, NULL, 1);
preempt_enable();

然后再free, 正确性和可行性还不敢保证。

论坛徽章:
0
6 [报告]
发表于 2014-07-16 08:53 |只看该作者
本帖最后由 leiweigan1 于 2014-07-16 08:53 编辑

回复 5# yiifburj
能具体点说明,无锁删除的方法吗?类似于rcu?


   

论坛徽章:
0
7 [报告]
发表于 2014-08-23 14:23 |只看该作者
回复 6# leiweigan1


    on_each_cpu应该有问题, 帖子已更改, 因为on_each_cpu先在其他cpu上执行, 再在本cpu上执行, 应该顺序掉过来。

   双向或单项链表 a b c , 删除b, 改变a->next和c->prev, 这样b就从链表上下来了, b指针指向不动, 然后smp_mb(); on_each_cpu(...);/* 不需要on_each_cpu, 因为本cpu已经有smp_mb()了, 可以去掉, 忘了那个函数的名字了, 见on_each_cpu的实现,*/ , 本cpu加入smp_mb(); 表明 a, c里面的指针指向的更改此时此刻已经提交,其他cpu可见, 然后其他cpu执行smp_mb();表明其他cpu执行smp_mb之后的内存操作均在smp_mb后面完成, 这样其他cpu拿到的本cpu的数据就是更新之后的, b可以安全的free掉了。

只是推测, 还不敢保证, 另外可能有更简单的方法, rcu没有仔细研究过。

论坛徽章:
0
8 [报告]
发表于 2014-08-25 08:31 |只看该作者
回复 7# yiifburj
以单项链表为例,a-》b-》c,删除b,a->next = c,这不是原子操作, 有可能在赋值a-》next的时候,c已经被删除了吧?


   

论坛徽章:
0
9 [报告]
发表于 2015-07-06 12:03 |只看该作者
回复 8# leiweigan1


    抱歉, 忘了来这里了, 这种方法只能同时一个人修改, 当同时多个人改的时候不能无锁, 但只是修改的人需要锁, 读的不需要.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP