免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
121 [报告]
发表于 2006-08-11 16:11 |只看该作者
原帖由 mik 于 2006-8-11 16:04 发表


打断一下,你所说的加锁是怎么个加锁法?

比如在 b = i; 之前同时在 b 和 i 上加锁。别的线程如果要访问 b 或者 i 则要首先测试是否加锁。这样保证 b = i; 是不可打断的,也就是原子的喽~

论坛徽章:
0
122 [报告]
发表于 2006-08-11 16:13 |只看该作者
原帖由 gvim 于 2006-8-11 16:09 发表
从下面isjfk 开始有部分争论存在于"多条语句的赋值是否仍然是原子的",基于此我发表了自己的见解。

冤枉哪,“多条语句的赋值是否是原子的”这是小思引发的争论

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
123 [报告]
发表于 2006-08-11 16:14 |只看该作者
原帖由 思一克 于 2006-8-11 15:57 发表
原子性就是从使用者角度不用加琐来保证数据的一致性。
至于中间是否有中断打断不用管。

谈系统调用的原子性就是这含义。比如write,有数百上千汇编指令,但在许多时候都可以说是原子的。


这个原子性的定义是不对的。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
124 [报告]
发表于 2006-08-11 16:17 |只看该作者
原帖由 isjfk 于 2006-8-11 16:01 发表

就你前面的程序来说吧,假设在每一个赋值语句两边都加了锁。用你的观点,现在都是原子的了对吧。

但是后边的 if 一样可能成立。因为中断会发生在任何时候。对于下一条语句来说,前面的结果总是不可靠的。所以 ...


你是怎么加锁的?

我得意思是
lock();
b = i;
unlock();

lock()
movl i, %eax
movl %eax, b
ulock()

不错,if 仍然会发生,不过那是@34和@45的情况了,而不是@23的情况。
对于原子性,在执行 b=i 的时候,我可以肯定的告诉你,在执行完这条 b=i 之后,b一定就是i,并且就是我要的i,i 不可能在中间变化。
如果还不理解,只有去k书了,我只能说到这个份上了

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
125 [报告]
发表于 2006-08-11 16:19 |只看该作者
至此为止,我同意gvim

论坛徽章:
0
126 [报告]
发表于 2006-08-11 16:21 |只看该作者
原帖由 gvim 于 2006-8-11 16:17 发表
你是怎么加锁的?

我得意思是
lock();
b = i;
unlock();

lock()
movl i, %eax
movl %eax, b
ulock()

不错,if 仍然会发生,不过那是@34和@45的情况了,而不是@23的情况。
对于原子性,在执行 b=i 的时候,我可以肯定的告诉你,在执行完这条 b=i 之后,b一定就是i,并且就是我要的i,i 不可能在中间变化。
如果还不理解,只有去k书了,我只能说到这个份上了

我也是差不多的意思。如果 b = i 是原子的,那 b = i 之后显然 b 和 i 是一样的,但是对于 b = i 的下一条语句来说,b 未必就等于 i,因为两条语句中间可能会发生中断。

既然对于下一条语句来说,b 是不是等于 i 总是无法保证的,那原子性又有什么意义呢

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
127 [报告]
发表于 2006-08-11 16:30 |只看该作者
原帖由 isjfk 于 2006-8-11 16:21 发表

我也是差不多的意思。如果 b = i 是原子的,那 b = i 之后显然 b 和 i 是一样的,但是对于 b = i 的下一条语句来说,b 未必就等于 i,因为两条语句中间可能会发生中断。

既然对于下一条语句来说,b 是不是等 ...

An atomic operation in computer science refers to a set of operations that can be combined so that they appear to the rest of the system to be a single operation.

Conditions
To accomplish this, two conditions must be met:

   1. Until the entire set of operations completes, no other process can know about the changes being made; and
   2. If any of the operations fail then the entire set of operations fails, and the state of the system is restored to the state it was in before any of the operations began.

To the rest of the system, it appears that the set of operations either succeeds or fails all at once. No in-between state is accessible. This is an atomic operation.

from http://en.wikipedia.org/wiki/Atomic_operation

你管它下一条做什么??
>>>be a single operation
原子性对应的是一个操作,而不是两个操作。
>>>No in-between state is accessible
是否@23时的情况就是在中途窃取了 i 的值?

论坛徽章:
0
128 [报告]
发表于 2006-08-11 16:36 |只看该作者
原帖由 gvim 于 2006-8-11 16:30 发表



from http://en.wikipedia.org/wiki/Atomic_operation

你管它下一条做什么??
>>>be a single operation
原子性对应的是一个操作,而不是两个操作。
>>>No in-bet ...



是的,从理论上是你说的那样。但是实际上对 int 型赋值的操作即使中间被打断也没有影响。所以 linux 可以无法无天的直接用一个整形赋值就定义了 atomic_set 而没有加任何的锁(哦,是在绝大部分平台上)。

我看争论大概可以结束了,话都说明白了,再争下去也没什么新鲜的啦

论坛徽章:
0
129 [报告]
发表于 2006-08-11 16:46 |只看该作者
原帖由 gvim 于 2006-8-11 16:17 发表


你是怎么加锁的?

我得意思是
lock();
b = i;
unlock();

lock()
movl i, %eax
movl %eax, b
ulock()

不错,if 仍然会发生,不过那是@34和@45的情况了,而不是@23的情况。
对于原子性,在执 ...



请问:这个lock()怎么实现呢?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
130 [报告]
发表于 2006-08-11 16:47 |只看该作者
原帖由 isjfk 于 2006-8-11 16:36 发表



是的,从理论上是你说的那样。但是实际上对 int 型赋值的操作即使中间被打断也没有影响。所以 linux 可以无法无天的直接用一个整形赋值就定义了 atomic_set 而没有加任何的锁(哦,是在绝大部分平台上 ...



是这样吗???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP