首页 新闻 会员 周边

多线程问题,请给理由

0
悬赏园豆:80 [已解决问题] 解决于 2012-07-02 11:10

多个线程同时读一个数据,不用加锁是吧?

多个线程同时使用一个方法,不用加锁是吧?

多个线程同时使用一个委托,用加锁吗?

迅捷网络[来送福利]的主页 迅捷网络[来送福利] | 小虾三级 | 园豆:576
提问于:2012-06-07 12:58
< >
分享
最佳答案
0

@今昭 说的很明确了。

1:读取数据的时候,也要看是否有别的线程在写数据,如果有别的线程在写,还是需要加锁的,如果是静态数据,所有线程只是进行读取,一般无需枷锁,当然访问一些临界资源,诸如文件操作等还是需要加锁的。

2:使用一个方法是否需要加锁,需要看你的方法是否是可重入的,如果需要的数据都是由调用者提供的,在方法内部不会调用其他的不可重入的方法,且方法中不访问静态全局的非常量数据、不返回此类数据,这种情况下多线程条用一个方法无需加锁,如果出现上述情况,则需要将不可重入的方法改造为可重入的。还要考虑一点是在方法内部多线程的线程安全问题,例如出现1中的情况,出现特别出现静态或者全局数据的访问的情况。

3:委托的情况和2是类似的。

收获园豆:20
zsounder | 老鸟四级 |园豆:2819 | 2012-06-12 12:59
其他回答(6)
0

问题一:不一定,看对读取数据的要求,如果是实时读取的话还是需要锁的;

问题二:不一定,如果这个方法中出现问题一的情况也是需要锁的,但这个锁只是这个资源的访问锁不是方法的锁,在多线程中方法是各自都有拷贝的,所以不存在竞争关系;

问题三:不一定,问题如二;

收获园豆:1
today4king | 园豆:3499 (老鸟四级) | 2012-06-07 13:32

问题1.你的回答什么意思? 什么是你说的'实时读取'????

支持(0) 反对(0) 迅捷网络[来送福利] | 园豆:576 (小虾三级) | 2012-06-07 13:34

@[秦时明月]: 就是线程每次读取有可能对数据进行操作而导致数据发生改变时,就应该加锁

支持(0) 反对(0) 云桥梦心 | 园豆:222 (菜鸟二级) | 2012-06-07 14:40

@云桥梦心: 改变的数据不是公共的数据就不用,是吧?

支持(0) 反对(0) 迅捷网络[来送福利] | 园豆:576 (小虾三级) | 2012-06-07 16:30
0

读数据一般不加锁,但写数据是需要加锁的。调用方法是不用加锁的,但方法内部是否加锁,请注意访问公有变量时的操作。

收获园豆:46
sinhbv | 园豆:2579 (老鸟四级) | 2012-06-07 15:10
0

1:通常不用,尤其都是读不用加锁的情况比较多见,多数是非关键性的状态数据的读取。除非两个线程对同一数据的访问都要求独占一些代码片段,(一般是有一个线程要改写这个数据)这时候才需要使用临界区。

2.取决于你的方法是否是多线程安全的。如果是,就是可以并发的。无所谓的。

3.应该同2.

4.加锁会严重降低并发访问和多线程性能。所以不要随意乱加锁。

收获园豆:5
hoodlum1980 | 园豆:559 (小虾三级) | 2012-06-07 15:14

第二条能举例吗?

支持(0) 反对(0) 迅捷网络[来送福利] | 园豆:576 (小虾三级) | 2012-06-07 16:29

@[秦时明月]: 

举例来说就是函数里是否使用/依赖了static类型的数据,指向同一块数据的指针进行数据读写。访问了不是多线程安全的资源,调用了其他不是多线程安全的函数等。这样的函数不是多线程安全的。

每个线程有自己的栈,所以函数的栈上自动分配的临时变量是多线程安全的。例如int a,char s[256]; 等这种。但如果前面加个static就不是线程安全的了。

支持(0) 反对(0) hoodlum1980 | 园豆:559 (小虾三级) | 2012-06-07 17:13
0

多线程同时读一个数据,要看是读取什么数据 ,如果是一个变量肯定不用枷锁。但是读取一个文件,会报错
多线程同时使用一个方法理论上是不会有错但是,某些特定情况会重复读取一条数据

目前我也在玩 线程有什么不懂的地方大家可以一起交流  QQ185367128

收获园豆:5
落幕残情 | 园豆:34 (初学一级) | 2012-06-07 15:26
0

用clojure做多线程超简单,不管在JVM还是在.net都不用操心锁的问题。Clojure多线程的方法STM最早源自数据库InterBase(其开源版Firebird SQL更好)的多代版本体系,同时解决了并发及事务处理,很牛很简洁。早期各大数据库都不看好该技术,但现在各种大中型商业或开源数据库都支持该技术,当然还很嘴硬很鸵鸟地另外起个名字。

收获园豆:1
林鹏程财务分析软件 | 园豆:211 (菜鸟二级) | 2012-06-07 21:45
0

答案同一楼

原因:虽说是多线程读数据,但总有一个线程或别的什么写这个数据(如果这个数据保持不变,那和多线程没关系,就不用谈锁得问题了),线程A读,线程B写,线程C再读,此时AC读到的数据可能不一致.此时根据需要,可能会出现A读,加锁,B等待,C读,释放锁,B写这种情况.

收获园豆:1
碧落星痕 | 园豆:708 (小虾三级) | 2012-06-09 18:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册