两个线程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置空了

解决方案 »

  1.   

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

  2.   

    我知道是lock就行了,不过还是想要详细点的代码。在哪个部分lock好呢?
      

  3.   

    所有对List的Add跟Remove的操作都写在Lock里面就好了
      

  4.   

    你说的没错,如果对List的操作都是在C类函数里,那就好办了。现在关键是threadB,获取C的list,然后清空List这个过程不可能都写到C类函数里啊,那该怎样lock呢?
    因为获取-清空 这一过程完成前不允许threadA操作list才行,而且肯定是在threadB中获取-清空。
      

  5.   

    lock()
    {
    获取list,
    清空list
    }
    如何将大括号中的代码原子化?
      

  6.   

    因为操作c的list(获取,然后清空),要求是在threadB中原子化,但是c的list数据增加却是在threadA中的,所以感觉用lock的办法是解决不了了,只能用信号机制。
      

  7.   

    在类C中的锁定义为public static readonly object syncRoot = new object();
    然后lock(C.syncRoot)
    {
        操作
    }
    不可以?
    或者你ThreadA, ThreadB也总是得在一个类里来创建的吧。比如说类A
    那么你类A里
    private readonly object syncRoot = new object();
    //ThreadA的方法
    void FuncA()
    {
        lock(syncRoot)
       {
        C.获取数据方法()
        }
    }void FuncB()
    {
        lock(syncRoot)
       {
        C.清空数据方法()
        }
    }