免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2010-12-28 16:41 |只看该作者
哦,我理解错了。我想表达的意思是,我看那个APUE里说,例如在文件结尾写东西,如果两个函数实现,先定位到最后,再写,就可能会中间有中断,如果只有一个函数实现,就不会出现此问题。

论坛徽章:
0
12 [报告]
发表于 2010-12-28 17:10 |只看该作者
32位的CPU 一个CPU时间处理32位 是不是程序占用的这8位 有可能恰好被分配到2个CPU时间 进而可能引发冲突? 所有需要加锁...   还是逻辑运算 需要多条指令完成 所有需要加锁?

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
13 [报告]
发表于 2010-12-28 19:40 |只看该作者
读写一个8bit的char需要加锁吗?!
-->单cpu,根本不用。多cpu可能需要。无论如何,都要注意编译器的优化

论坛徽章:
0
14 [报告]
发表于 2010-12-28 20:49 |只看该作者
可重入函数
    可重入的函数简单来说就是可以被中断的函数
原子操作
    在一个CPU时钟内保证完成 ...
newroot_phy 发表于 2010-12-28 13:36



    多线程有自己的栈。线程切换时入栈出栈,保存上下文是内核做的事,只要是线程安全就可以。如果是信号的话,只要可重入就行。不必要考虑到cpu的原子性(除非是对一个全局变量访问时)。

论坛徽章:
0
15 [报告]
发表于 2010-12-28 23:21 |只看该作者
多线程有自己的栈。线程切换时入栈出栈,保存上下文是内核做的事,只要是线程安全就可以。如果是 ...
linyunxian 发表于 2010-12-28 20:49



  
你事实上没有回答我的问题!

这个贴中你要求有两个
1. 如果是多线程: 只要线程安全就可以   <= 这就是我所问的,如何实现线程安全,当然是以某种方法实现线程间共享数据访问的同步,哪么Uint8之类的数据是否需要同步,这才是我的问题.

2. 信号:这个跟多线程对共享数据的访问没有什么本质的区别.

对于"除非是对一个全局变量访问时", 这个说话好像也不太合适, 不一定是全局变量的访问才有这个问题,我觉得用线程/进程间可访问的数据比较合适.

论坛徽章:
0
16 [报告]
发表于 2010-12-28 23:25 |只看该作者
读写一个8bit的char需要加锁吗?!
-->单cpu,根本不用。多cpu可能需要。无论如何,都要注意编译器的优化
chenzhanyiczy 发表于 2010-12-28 19:40



    为什么没有必要?!
    据我的理解,就算在单CPU上, 对UINT8的访问也是由多条汇编指令完成,这些指令的执行完全有可能被中断!

     不太明白你所说的"都要注意编译器的优化"是什么意思, 是对UINT8数据访问的多条指令进行加锁以实现原子操作吗?

论坛徽章:
0
17 [报告]
发表于 2010-12-28 23:32 |只看该作者
32位的CPU 一个CPU时间处理32位 是不是程序占用的这8位 有可能恰好被分配到2个CPU时间 进而可能引发冲突?  ...
wb112200 发表于 2010-12-28 17:10



    32位的CPU 一个CPU时间处理32位 是不是程序占用的这8位 有可能恰好被分配到2个CPU时间 进而可能引发冲突? 所有需要加锁...   还是逻辑运算 需要多条指令完成 所有需要加锁?

1. 32位说的是CPU一个时钟周期内所能处理的数据量, 跟这个应该没有关系吧! <=我不确定它们之间有什么关系.
2. 同意你的第二个观点. => "逻辑运算 需要多条指令完成"

论坛徽章:
0
18 [报告]
发表于 2010-12-28 23:40 |只看该作者
哦,我理解错了。我想表达的意思是,我看那个APUE里说,例如在文件结尾写东西,如果两个函数实现,先定位到 ...
xiaobenniao514 发表于 2010-12-28 16:41



兄弟,你把我说糊涂了,这跟几个函数实现没有什么关系吧!

或许我没明白你想表达的意思! 见笑!!

论坛徽章:
0
19 [报告]
发表于 2010-12-28 23:50 |只看该作者
这种问题光 c/c++ 版已经被讨论过很多次了。
LZ想一想到底想问什么

论坛徽章:
0
20 [报告]
发表于 2010-12-29 12:59 |只看该作者
本帖最后由 newroot_phy 于 2010-12-29 13:00 编辑
这种问题光 c/c++ 版已经被讨论过很多次了。
LZ想一想到底想问什么
mik 发表于 2010-12-28 23:50



我想问的是, 对共享基本数据类型(char, int ...)的读写,在各种情况下(多线程/多进程/多核)(X86/MIPS/SPARC),是否有可能被中断!为什么?!

是否有相关的资料证实这一点!?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP