免费注册 查看新帖 |

Chinaunix

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

[C++] 在线程编程中(linux环境)数据处理一定要加互斥锁等操作吗 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-07-31 12:49 |只看该作者
这个应该是有影响的,估计碰上的几率也非常小

论坛徽章:
0
12 [报告]
发表于 2008-07-31 13:13 |只看该作者
原帖由 los 于 2008-7-31 12:40 发表


读写什么变量是原子操作,可以不用加呢?



一般的写操作都不能认为是原子操作

论坛徽章:
0
13 [报告]
发表于 2008-07-31 13:14 |只看该作者
原帖由 los 于 2008-7-31 10:29 发表
两个线程,其中一个线程仅对全局变量读,另一个线程可读可写,是否可以不用做处理?


还是加个锁吧

论坛徽章:
0
14 [报告]
发表于 2008-07-31 13:16 |只看该作者
写肯定不是原子操作了,是先放到缓冲区的。
如果代码函数都是具有可重入性的,应该不用加锁吧。
个人感觉不加锁对代码要求会非常高。

论坛徽章:
0
15 [报告]
发表于 2008-07-31 13:21 |只看该作者
原帖由 deanshuai 于 2008-7-31 13:16 发表
写肯定不是原子操作了,是先放到缓冲区的。
如果代码函数都是具有可重入性的,应该不用加锁吧。
个人感觉不加锁对代码要求会非常高。


后面两句不是太明白,能否举个例子解释下呢

论坛徽章:
0
16 [报告]
发表于 2008-07-31 14:01 |只看该作者
原帖由 los 于 2008-7-31 12:43 发表


我的变量没有精度要求,整数型就可以了,如果一个线程在写的时候,另一个同时读,linux系统有保证机制不出问题吗?


我说的精度不是数据类型精度的意思,只是说要看应用场合。

我看你的要求不需要加锁,一个线程在写的时候,另一个同时读本身不会出什么问题。只不过有可能读到的数据不是最新版本。

比如你下载了某个软件的版本,在使用的时候软件公司又推出了更新的版本,这并不影响你使用原来的版本(一般情况是这样的,不排除某些变态软件)

论坛徽章:
0
17 [报告]
发表于 2008-07-31 14:34 |只看该作者
谢谢rainysky ,不过我这里不讨论读出来的值是不是最新的问题,我关心两个线程在同时对同一个变量操作的时候,系统会不会发生冲突导致阻塞之类的现象

论坛徽章:
0
18 [报告]
发表于 2008-07-31 14:53 |只看该作者
明白, 你担心的是 一个在读的时候, 另一个写,是否会造成读的出问题? 或者写的出问题。

简单的类型 如int long, 固定的结构struct 是没问题的。

如果是 class, 你又在利用成员函数操作, 那多半是会出问题了。

单独的说 如果这个内存块, 你就只当做数据来用,是没问题的。如果是对象, 还是加吧。

论坛徽章:
0
19 [报告]
发表于 2008-07-31 15:02 |只看该作者
用线程编程,有共享数据,即使仅是一个int变量,也必须进行保护吗?有没有更权威的解释?

论坛徽章:
0
20 [报告]
发表于 2008-07-31 15:23 |只看该作者

回复 #19 los 的帖子

如果每次操作都是只有读或写的话(没有++之类的操作),现在的平台上是不用保护。
C语言标准里面的sig_atomic_t类型一般都是int的typedef.
如果需要++的操作的话,可以用atomic_t类型。

ps:ACE的ACE_Atomic_Op就对不同平台做了不同的封装,挺简便的。

[ 本帖最后由 jigloo 于 2008-7-31 15:26 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP