免费注册 查看新帖 |

Chinaunix

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

娘的, 似乎犯错误了----技术帖 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2012-07-11 10:22 |只看该作者
qishking 发表于 2012-07-03 20:51
虽不懂,但觉厉

同感......我好想参与啊.....

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
42 [报告]
发表于 2012-07-11 10:41 |只看该作者
liuiang 发表于 2012-07-10 23:22
atomic_xxx,都是smp_mb(); __asm__ __volatile__() ; smp_mb(); 与你的代码有点细微差别。

简单说:ato ...
如果只有前面的mb,那么asm段执行之后,没有mb的话,很短的一个时间内,另外一个任务执行第一个mb将会无法获得更新


为什么?

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
43 [报告]
发表于 2012-07-13 22:19 |只看该作者
先定义一个简单的模型:

任务1:一直收集东西,每收集一个,调用atom_inc对cc变量进行加1操作,并且对返回值进行判断如果大于等于10,就设置一个全局变量a为1通知另外的任务;

任务2:一直检测全局变量a,如果为1,则认为任务1已经收集到10个,然后调用atom_sub一次性消耗掉10个;

因此:
任务1:
while(1)
{
收集;
count = atom_inc(&cc);
if (count >= 10)
  {
  a = 1;
  }
}

任务2:
while(a == 0);
atom_sub(10,&cc);

我们将任务1用汇编展开,并且仅在atom_inc前面采用一个mb,同时为了防止ll/sc的干扰(事实上跟cache一致性有关),我们用cc++代替:
while(1)
{
收集
mb()
reg = cc;
reg++;
cc = reg;
if(reg >= 10)
  {
  a = 1;
  }
)
因为cc = reg;后面没有mb(),这里就隐藏了一个问题,a=1和cc=reg可能会乱序,就是说可能先执行a=1,然后执行了cc=reg。

当这种情况发生时,问题就会出来了,任务2发现a已经是1了,然后就进行了sub操作,就会出问题。

当atom_inc()后面增加mb后,就会将cc=reg和a=1两个进行强序化,任务2发现a=1的时候,cc必然被赋了新值。

实际运行的情况远比我说的复杂的多,但大概也就是这意思。

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
44 [报告]
发表于 2012-07-13 22:26 |只看该作者
不好意思,上贴count = atom_inc(&cc);应该为count = atomic_inc_return(&cc);

事实上对于单纯的atomic_inc没有返回值的那种,仅是原子增加,ll/sc会保证原子性,因为没有返回值,所以可以认为没有与其先关的存储操作,因此不需要mb()。

论坛徽章:
0
45 [报告]
发表于 2012-07-14 01:39 |只看该作者
呵呵,,




















______________________________________________________________
QQ情侣头像 QQ个性名字

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
46 [报告]
发表于 2012-07-14 12:37 |只看该作者
楼主你的召唤功能怎么用的?

论坛徽章:
0
47 [报告]
发表于 2012-07-17 10:08 |只看该作者

论坛徽章:
0
48 [报告]
发表于 2012-07-26 14:09 |只看该作者
1的问题,之前看的一篇文章里要求使用memory barrier来保证不会发生指令重排。下面的这一小节是我自己翻译的,英文好的可以找一下原文。
http://blog.chinaunix.net/uid-10647744-id-3052662.html

2的问题,cache有缓存同步协议保证多个线程操作同一个变量的一致性,但是寄存器与缓存之间是如何保持的这个同步就不晓得了……

另,寄存器状态是线程私有的。

论坛徽章:
0
49 [报告]
发表于 2012-07-26 16:29 |只看该作者
ARM  的感觉               

论坛徽章:
0
50 [报告]
发表于 2012-10-06 10:34 |只看该作者
学无止境、、、、顶、、、
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP