Chinaunix

标题: 在线程编程中(linux环境)数据处理一定要加互斥锁等操作吗 [打印本页]

作者: los    时间: 2008-07-31 10:29
标题: 在线程编程中(linux环境)数据处理一定要加互斥锁等操作吗
两个线程,其中一个线程仅对全局变量读,另一个线程可读可写,是否可以不用做处理?
作者: los    时间: 2008-07-31 11:04
这样应该不会有不良后果吧,在线等高手解答,谢~~~~~
作者: los    时间: 2008-07-31 11:08
比如一个线程读某个变量的时候,正好另一个对它赋值,这样会有问题吗,谁有这方面的资料可查啊
作者: net_robber    时间: 2008-07-31 11:17
写竞争的时候加,原则是锁的影响最小化
作者: 77h2_eleven    时间: 2008-07-31 11:26
个人感觉不用加。
等待权威说法。
作者: ustar    时间: 2008-07-31 12:31
读写整型变量不是原子操作,所有要加锁
作者: rainysky    时间: 2008-07-31 12:34
主要看你变量的用途,如果只是保存一些不用太精确的信息,如进度啥的,可以不用加。
作者: los    时间: 2008-07-31 12:39
原帖由 net_robber 于 2008-7-31 11:17 发表
写竞争的时候加,原则是锁的影响最小化


写不会有竞争的时候,是不是不用加了?
作者: los    时间: 2008-07-31 12:40
原帖由 ustar 于 2008-7-31 12:31 发表
读写整型变量不是原子操作,所有要加锁


读写什么变量是原子操作,可以不用加呢?
作者: los    时间: 2008-07-31 12:43
原帖由 rainysky 于 2008-7-31 12:34 发表
主要看你变量的用途,如果只是保存一些不用太精确的信息,如进度啥的,可以不用加。


我的变量没有精度要求,整数型就可以了,如果一个线程在写的时候,另一个同时读,linux系统有保证机制不出问题吗?
作者: gawk    时间: 2008-07-31 12:49
这个应该是有影响的,估计碰上的几率也非常小
作者: ustar    时间: 2008-07-31 13:13
原帖由 los 于 2008-7-31 12:40 发表


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



一般的写操作都不能认为是原子操作
作者: gigabyte    时间: 2008-07-31 13:14
原帖由 los 于 2008-7-31 10:29 发表
两个线程,其中一个线程仅对全局变量读,另一个线程可读可写,是否可以不用做处理?


还是加个锁吧
作者: deanshuai    时间: 2008-07-31 13:16
写肯定不是原子操作了,是先放到缓冲区的。
如果代码函数都是具有可重入性的,应该不用加锁吧。
个人感觉不加锁对代码要求会非常高。
作者: los    时间: 2008-07-31 13:21
原帖由 deanshuai 于 2008-7-31 13:16 发表
写肯定不是原子操作了,是先放到缓冲区的。
如果代码函数都是具有可重入性的,应该不用加锁吧。
个人感觉不加锁对代码要求会非常高。


后面两句不是太明白,能否举个例子解释下呢
作者: rainysky    时间: 2008-07-31 14:01
原帖由 los 于 2008-7-31 12:43 发表


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


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

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

比如你下载了某个软件的版本,在使用的时候软件公司又推出了更新的版本,这并不影响你使用原来的版本(一般情况是这样的,不排除某些变态软件)
作者: los    时间: 2008-07-31 14:34
谢谢rainysky ,不过我这里不讨论读出来的值是不是最新的问题,我关心两个线程在同时对同一个变量操作的时候,系统会不会发生冲突导致阻塞之类的现象
作者: maxmaxsh    时间: 2008-07-31 14:53
明白, 你担心的是 一个在读的时候, 另一个写,是否会造成读的出问题? 或者写的出问题。

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

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

单独的说 如果这个内存块, 你就只当做数据来用,是没问题的。如果是对象, 还是加吧。
作者: los    时间: 2008-07-31 15:02
用线程编程,有共享数据,即使仅是一个int变量,也必须进行保护吗?有没有更权威的解释?
作者: jigloo    时间: 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 编辑 ]
作者: los    时间: 2008-07-31 16:28
看来还是用原子操作好了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2