免费注册 查看新帖 |

Chinaunix

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

对int变量的赋值是原子操作吗? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
21 [报告]
发表于 2006-08-09 09:52 |只看该作者
整型变量赋值本来就不是原子的,
不过不是原子的倒也不是说它会分字节拷贝。

两个线程共享同一个变量是否需要加锁,
根据需要来定。
但是如果两个线程有可能同时修改这个变量的话,
那么一定是需要加锁的。

论坛徽章:
0
22 [报告]
发表于 2006-08-09 09:53 |只看该作者
8951单片 肯定比INTEL 586 “笨”了。

我说“笨”没有不好的意思。各有各的用途。

论坛徽章:
0
23 [报告]
发表于 2006-08-09 09:56 |只看该作者
看linux内核中,各个不同cpu平台下atomic_t的定义就知道了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
24 [报告]
发表于 2006-08-09 10:20 |只看该作者
我刚才写了个例子。
http://svn.perlchina.org/trunk/m ... read/is_int_atomic/
如果多个线程同时修改一个变量是原子的,可以不加锁的话,那么这个程序每次运行的结果应该一定是 10000 的整数倍。
可惜它在我的机器上不是。

论坛徽章:
0
25 [报告]
发表于 2006-08-09 10:35 |只看该作者
to flw,

你的程序很好,我也实验了,结果和你同。

我猜想,你的count++; 这个不是原子的。看atomic.h,
atomic_inc(v)  是带LOCK的:
LOCK "incl %0" 指令。

只有atomic_read, atomic_set(赋值)不用LOCK。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
26 [报告]
发表于 2006-08-09 10:45 |只看该作者
哦,搞错了。
赋值在 x86 上自然是一条指令,那应该是原子的。

论坛徽章:
0
27 [报告]
发表于 2006-08-09 10:46 |只看该作者
to flw,

我将你程序的count++ 换为count = i

结果唯一9999

论坛徽章:
0
28 [报告]
发表于 2006-08-09 10:49 |只看该作者
to flw,

但我也糊涂的是 count++ 不是一条吗?我印象应该是汇编INC XXXX一条。
为什么就不行

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
29 [报告]
发表于 2006-08-09 10:50 |只看该作者
count ++;
应该不是一条指令。

论坛徽章:
0
30 [报告]
发表于 2006-08-09 10:57 |只看该作者
to flw,

count++; 也是一条incl   0x8049734

0x08048464 <aaaa+0>:    push   %ebp
0x08048465 <aaaa+1>:    mov    %esp,%ebp
0x08048467 <aaaa+3>:    incl   0x8049734
0x0804846d <aaaa+9>:    leave
0x0804846e <aaaa+10>:   ret
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP