免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6402 | 回复: 19
打印 上一主题 下一主题

[C] UINT8/UINT32做为共享数据,是否需要加锁 - 原子操作问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-27 23:20 |只看该作者 |倒序浏览
本帖最后由 newroot_phy 于 2010-12-29 13:58 编辑

读写一个8bit的char需要加锁吗?!在什么具体环境下,为什么!

前些天跟朋友讨论了这个问题,朋友说在汇编级别上,一个读操作也是有多条指令的,所以也是有可能被中断的!

以前我一直以为读写一个int, char之类的数据是不需要加锁的,我也是从外部(网络)了解到这个观点,没有什么理论依据,所以请大家指点!

-----------------
1. 修改主题

论坛徽章:
0
2 [报告]
发表于 2010-12-28 09:23 |只看该作者
不需要,系统api函数就是一原子操作,不会中间中断的

论坛徽章:
0
3 [报告]
发表于 2010-12-28 09:29 |只看该作者
不需要,系统api函数就是一原子操作,不会中间中断的
xiaobenniao514 发表于 2010-12-28 09:23

还真是什么都敢说

论坛徽章:
0
4 [报告]
发表于 2010-12-28 09:33 |只看该作者
有人说这些操作都不是原子的

论坛徽章:
0
5 [报告]
发表于 2010-12-28 09:38 |只看该作者
读写一个8bit的char需要加锁吗?!在什么具体环境下,为什么!

前些天跟朋友讨论了这个问题,朋友说在汇编级别 ...
newroot_phy 发表于 2010-12-27 23:20



    弄清楚是否原子跟是否可重入,是否线程安全后,就不会迷惑了。 对于应用来说,最多只需要考虑到可重入的问题

论坛徽章:
0
6 [报告]
发表于 2010-12-28 09:50 |只看该作者
不一定要加锁,可以用原子变量嘛

论坛徽章:
0
7 [报告]
发表于 2010-12-28 13:01 |只看该作者
不需要,系统api函数就是一原子操作,不会中间中断的
xiaobenniao514 发表于 2010-12-28 09:23



    {:3_205:} 不是吧!这跟系统API有什么关系!?

论坛徽章:
0
8 [报告]
发表于 2010-12-28 13:06 |只看该作者
不一定要加锁,可以用原子变量嘛
wwwhenan 发表于 2010-12-28 09:50



    呵呵!!不局限某种特殊的数据类型!

我只明想找些证据证明存取uint8/uint32之类的数据类型是否是原子操作!

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
9 [报告]
发表于 2010-12-28 13:10 |只看该作者
用了原子操作就不用吧,如果没用可能会产生读出/写入的汇编,就会被打断了。

论坛徽章:
0
10 [报告]
发表于 2010-12-28 13:36 |只看该作者
弄清楚是否原子跟是否可重入,是否线程安全后,就不会迷惑了。 对于应用来说,最多只需要考虑到可 ...
linyunxian 发表于 2010-12-28 09:38



可重入函数
    可重入的函数简单来说就是可以被中断的函数
原子操作
    在一个CPU时钟内保证完成的一个指令

不知道理解对不对!

刚刚跟同事又聊了一下,结论是读写Uint8是有可能被中断的,拿一个赋值操作(MIPS)来说a = b;(因为不熟悉汇编,没法通过汇编进行说明)

1. load b 地址到寄存器 R1
2. load b 的值到寄存器 R2
3. load a 地址到寄存器 R3
4. 将R2赋值到R3

所以目前的结论是UINT8在多线程(进程)之间共享(读写),是需要加锁保护的!

请大家补充!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP