免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
31 [报告]
发表于 2012-06-27 12:31 |只看该作者
回复 30# zylthinking


    anything is possiblem, it may be optimize and not have a memory slot.

论坛徽章:
0
32 [报告]
发表于 2012-06-27 12:55 |只看该作者
回复 29# zylthinking


春熙路。

儿子一笑是另外一个意境,两者是人生不同时间段的经历,都是美好。

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
33 [报告]
发表于 2012-06-27 13:20 |只看该作者
zylthinking 发表于 2012-06-27 12:24
*(lkp) = 0 这样形式的代码, 会优化 lkp 对应的变量为寄存器吗
如果答案是否, 那么 unlock 也就不需 ...


这个好像说不准吧

在毛的情景分析中,在谈到修改jiffies变量时,提过一个说法,大概是*(unsigned int *)(&jiffies)=xxx这样的写法,会编译成一条语句,不经过寄存器。

但是我记得也不清楚。再说就算没记错,是不是编译成这种结果恐怕也根据CPU,优化选项......不同而不同。所以保险起见,kernel中就是smp_mb在单核下退化为__asm__ __volatile__(:::"memory"),弄了个编译屏障

论坛徽章:
0
34 [报告]
发表于 2012-06-27 16:38 |只看该作者
3.如果在不同的翻译单元就具有external linkage,也就是说确定两个文件的n是指同一个对象,那么引起undefined behavior。
依据:
ISO C11(N1570)
6.2.7/2 All declarations that refer to the same object or function shall have compatible type; otherwise, the behavior is undefined.
6.7.3/10 For two qualified types to be compatible, both shall have the identically qualified version of a compatible type; the order of type qualifiers within a list of specifiers or qualifiers does not affect the specified type.
否则(比如说extern int n;前面有static int n;的情况)就没这个问题。

论坛徽章:
0
35 [报告]
发表于 2012-07-03 11:49 |只看该作者
volatile是个相对宏观的量,你要是自己建lock,就不需要volatile了

单cpu建立锁的话,应该是个很好解决的东东

多cpu的话,就不太懂了,一个cpu在锁,另一个会不会无视,不太懂。(不太愿意去想,无非是搞个和CPU状态无关的东东,呵呵)

论坛徽章:
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
36 [报告]
发表于 2012-07-03 13:11 |只看该作者
本帖最后由 zylthinking 于 2012-07-03 13:44 编辑
塑料袋 发表于 2012-06-27 11:34
ARM体系的atomic.h中,更能反映锁的本质是什么。 x86的atomic.h则很难看出来。

所有带返回值的atomic_xxx,都是smp_mb(); __asm__ __volatile__() ; smp_mb();


针对 unlock 的情况
前面的 smp_mb 可以理解, 但后面的就不明白了;
为什么要保证锁变量本身也被立即可见, 就算暂时不可见又有什么关系呢?

比如
        #define unlock(lkp) do{    \
            __asm__ __volatile__("": : :"memory"); \
            *(lkp) = 0;  \
        }while(0)
不行吗?

区别是:

anything
unlock(lkp);
p = 0;

可能会导致实际效果如下的序列:
anything
p = 0;
*(lkp) = 0;

但 p 本来就没有在锁保护下, 那么就算像这样置入锁保护下, 应该也没关系
换句话说, 在锁保护下的语句不能放在锁外执行, 但不在锁保护下的语句放入锁内执行, 应该没关系

甚至
anything
mov lkp to reg1
p = 0;
mov 0 to reg2
mov reg2 to *reg1
似乎也不会造成任何影响

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

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
38 [报告]
发表于 2012-07-04 18:05 |只看该作者
回复 1# zylthinking

为什么不能保持声明与定义的一致?

不能
int volatile n = 0;
extern int volatile n;

或者
int n = 0;
extern int n;
并且在使用处 int volatile& rn = n;?


gcc无警告通过太容易了……
int f(int x) { return x+1; }
extern double f(double);
只要在不同翻译单元,并且是C链接,就可以无警告通过……

论坛徽章:
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
39 [报告]
发表于 2012-07-04 18:10 |只看该作者
OwnWaterloo 发表于 2012-07-04 18:05
回复 1# zylthinking

为什么不能保持声明与定义的一致?


我只是较真。。。。。。。

论坛徽章:
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
40 [报告]
发表于 2012-07-10 23:22 |只看该作者
atomic_xxx,都是smp_mb(); __asm__ __volatile__() ; smp_mb(); 与你的代码有点细微差别。

简单说:atomic_xxx_return,必须要前后都要有mb,因为用mb的基本准则就是“mb需要成对出现”,成对出现并非信号量那样,同样一个上下文的成对,而是不同上下文的成对,如果只有前面的mb,那么asm段执行之后,没有mb的话,很短的一个时间内,另外一个任务执行第一个mb将会无法获得更新。

你的例子则没有什么问题,因为__sync_bool_compare_and_swap已经隐含有mb操作,所以,你的程序只需要对n加volatile,然后在n++和unlock之间加入mb即可。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP