免费注册 查看新帖 |

Chinaunix

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

[C++] 请教一个c++11 memory-ordering 的问题 [复制链接]

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-11-05 13:27 |显示全部楼层 |倒序浏览
void push(T const& data)
{
    counted_node_ptr new_node;

    new_node.ptr = new node(data);

    new_node.external_count = 1;

    new_node.ptr->next = head.load(std::memory_order_relaxed)

    while( !head.compare_exchange_weak(new_node.ptr->next,  
                                                                   new_node,
                                                                   std::memory_order_release,
                                                                   std::memory_order_relaxed) ) ;
}


C++ concurrency in action 书上的一段代码。

感觉

head.load(std::memory_order_relaxed)



while( !head.compare_exchange_weak(new_node.ptr->next,  
                                                                   new_node,
                                                                   std::memory_order_release,
                                                                   std::memory_order_relaxed) ) ;

指定 memory_order 参数并不会有什么影响,和 memory_order_seq_cst 好像没什么区别。

都是对同一个原子变量 head 做操作。

大牛指教。

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
2 [报告]
发表于 2016-11-05 14:20 |显示全部楼层
回复 2# windoze

多谢,你说的这些我知道,不过其实还是有问题想请教。
第一个问题,memory_order_relaxed 是说 CPU 可以重新编辑指令执行顺序,那么问题来了:


针对这个函数的代码,

void push(T const& data)
{
    counted_node_ptr new_node;    // 1

    new_node.ptr = new node(data);  // 2

    new_node.external_count = 1;  // 3

    new_node.ptr->next = head.load(std::memory_order_relaxed); // 4

    while( !head.compare_exchange_weak(new_node.ptr->next,  
                                                                   new_node,
                                                                   std::memory_order_release,
                                                                   std::memory_order_relaxed) ) ;
}


4 这一行有可能在 1 2 3 之前执行吗?




第二个问题,假如一个原子变量 count,线程 A 是 store(),线程 B 是load() 操作,那么线程 A 如果指定 store(memory_order_release) ,线程 B 指定 load(memory_order_acquire),这样的话,一定是 A 的store 发生在 B 的 load() 之前吗?

我一直认为,memory-ordering 参数只影响单个线程内部的指令执行顺序,不知道会不会在线程之间对同一个变量有影响。


多谢指教。











论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
3 [报告]
发表于 2016-11-06 10:06 |显示全部楼层
回复 7# wlmqgzm

pop 不是没看到,是没贴。
我先看看书。

我们的工程里绝对不会用到新标准的东西,没实践理解就不到位。

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
4 [报告]
发表于 2016-11-06 10:07 |显示全部楼层
回复 5# lxyscls


感谢指教,不过有些地方还是觉得有问题,我得再把书好好看看,然后再来请教。

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
5 [报告]
发表于 2016-11-06 10:25 |显示全部楼层
回复 6# wlmqgzm

你们用C++11的多线程相关的特性多吗?

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
6 [报告]
发表于 2016-11-07 11:23 |显示全部楼层
回复 13# lxyscls

非常感谢
对了,提到 wait-free 了,我就请教一下,wait-free 有什么好资料推荐一下。我目前 wait-free 和 lock-free 理解还不到位,书还没看完。原计划一个月看完的书,结果远超预期了。

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
7 [报告]
发表于 2016-11-07 13:26 |显示全部楼层
各位都是大牛啊,以前没接触过这方面的,也没见到有人发帖讨论,好家伙,这么多人精于此道啊。

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
8 [报告]
发表于 2016-11-07 14:05 |显示全部楼层
回复 18# lxyscls

V5
SPSC queue  第一次接触到,多谢。


我很想知道大牛们都在开发神马,为毛我经历的项目都这么水。。

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
9 [报告]
发表于 2016-11-07 14:48 |显示全部楼层
回复 21# TiGEr.zZ


解释很清晰,多谢多谢。

我也觉得 lock-free 好像并没有很难实现,就是有些地方可能一时会没想到,比如异常处理之类的,不过这跟并行本身貌似没关系。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP