日期:2014-05-16  浏览次数:20992 次

多线程有没有真正安全又不用lock的方法?
lock就要排队,排队就不是多线程? 

c#多线程采集数据,我把采集的方法,放到一个类里,新建的线程调用一个类的实例中的方法,这样同时还能传入各种参数,
但是如果不lock,这个过程依然不安全,会导致方法中的变量混乱,
但是lock了,线程就要排队,不是真正的多线程同时执行。

c#到底有没有真正的多线程,又安全的方法呢? 比如,我把执行的过程封装成一个单独的dll,然后每个线程都创建这个dll的实例,这个想法是不是和类其实是一个意思呢 ?   哎。。。。

希望大家能指点一下,

线程是动态创建的 
线程同时执行,不用排队
线程传入的参数不同 但是方法相同 
线程之间不要干扰 虽然执行同样的方法,但是互不影响 

千万别说执行几个exe.... 这不是正解吧。。 



------解决方案--------------------
引用:
我在一个类里,定义了一个字符串 string1 ,一开始 string str1=A,  到中间  str1=B, 最后 str1=C 
多线程分别调用的这个类的实例,这个时候,如果不lock,str1 的值就乱套了,应该是A的时候 不一定是A了 

这个变量是类里面的局部变量,并不是外部的共同变量。
按照网上的说法,类里面的变量都应该是安全的,所以我才选择的用类这种方法。
但是看起来,好像不对。
首先类里定义的变量不叫局部变量,叫做成员变量。同一个实例的成员变量只有一个,是共享的。
局部变量是在函数中定义的变量,在没有向外传送的时候是安全的。
------解决方案--------------------
引用:
lock就要排队,排队就不是多线程? 


在你的理解里, 排队了就一定慢了?

从某个角度上来说,多线程确实有快不太多——特别是对于那种老式的单核CPU, 只进行那种纯粹的科学计算来说。

换一个比较好理解的例子吧。
来了一车货要卸, 一个人负责把车上的东西一件件地往下搬到商店里(设为任务A), 另一个人负责把这些已经搬下来的东西放在商店的货架上(设为任务B)。

如果设计多线程, 那就让车上的人往下搬的人(任务A)再增加到5个。

好吧, 那你就说了: A的人有5个, B的才1个,那5个人到了B这里, 岂不是要排队了反而变慢?

其实并不是这样, 5个人搬东西的速度并不是一致的, 而且车上到商店还有一段路, 这样会导致不同做A的人到达B的时候并不是在同一时间, 所以排队的机会是很少的。

所以在5个一起做这种比较慢的事情, 速度虽然达不到5倍(偶尔还是得排一下队), 但效率也还是提高了……


你要做数据采集, 应该是从DB里取数据对吧?I/O操作是比较慢的, 比较适合用多线程。

至于你所说的lock , 建议你把思路整理一下, 把最简洁最能表达你思想的代码做成一个能运行的小demo, 然后贴出来。 再让人家去改善, 我想这样会有更多人愿意花点时间来帮你。

没有具体对象地空谈思路, 说不出个所以然来的