日期:2014-05-17  浏览次数:20954 次

C#,多线程共享数据的问题
两个线程threadA、threadB。
定义一个类C。C的主要作用是不定时的获取数据,放入C的静态变量容器d中(例如d是一个list)。
threadA开始运行,运行内容为,实例化一个C,开始C的功能。
threadB开始运行,运行内容为,每隔10秒钟,访问c.d,然后将c.d置空。
问题就是,当threadB,访问c.d后,然后置空这个过程中,threadA有没有可能又往c.d中加入了新的数据?这样就会丢失数据。
如果是这样,
如何在threadB访问c.d并置空这段代码运行时,阻止threadA往c.d加入数据呢?
我再举个简单的例子说明下问题:
threadA每隔1毫秒往c.d放入一个数据,例如到3毫秒时,放入了1、2、3,
这时,threadB访问了c.d,得到1、2、3然后将c.d置空。如果再访问c.d中的内容,会是4、5、6。。。吗?在未加锁的情况下,会不会成了5、6。。。丢失了4呢?
因为threadA放入数据4时,可能正好被threadB置空了。。。

------解决方案--------------------
lock就行了
------解决方案--------------------
很明显就是同步问题,用lock或monitor或者event进行互斥,另外建议你不要在线程内部创建C,然后在另I个线程去访问,因为线程结束后,它内部new的实例会销毁,所以最好创建一个线程外部对象,将其作为参数或属性传入线程
------解决方案--------------------
所有对List的Add跟Remove的操作都写在Lock里面就好了