老板给这样一个思路,用你两个锁lock1,lock2中分别写数据到数据库和从数据库读数据,有两个标志flag1、flag2,flag1限制lock2,flag2限制lock1,用这种方法解决两个线程互斥,我没太想明白,求教!!!

解决方案 »

  1.   


      private DataSet ds = new DataSet();        static int flag1;
            static int flag2;        public void write() //写数据
            {            lock (syncRoot)
                {
                    if (flag2 == 0)
                    {                    flag1 = 1;                                        //执行写操作
                        //**********
                        //向dt中写数据
                        //**********
                        flag1 = 0;                }
                    if (flag2 == 1)
                    {
                        flag1 = 1;
                    }
                }
            }        public void read() //读数据
            {
                lock (syncRoot)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (flag1 == 0)
                        {
                            flag2 = 1;
                            
                            //*******
                            // 读数据
                            //*******
                            //读完后判断是否还有读取任务,如有任务sleep(500);
                            Thread.Sleep(500);                    }                    if (flag1 == 1)
                        {
                            //*********
                            //整理数据
                            //*********
                            flag2 = 0;
                            //**************************
                            //结束本次循环,进入下一循环
                            //**************************
                            continue;
                        }
                    }
                }
            }
      

  2.   

    lock(ds)
    {
        ......
    }
    一个就够了。
      

  3.   

    可以直接lock一个dataset吗?那我怎样处理数据?
      

  4.   


    如果是为了实现线程同步或者数据库读写操作同步,那么只需要一个lock就够了。另外被锁的flag应定义为static const类型。
    private static const object flag = new object();
    位置1:写数据库:
    lock(flag)
    {
      writeDB();
    }
    位置2:读数据库
    lock(flag)
    {
      readDB();
    }
      

  5.   

    不知道这个行不行呢          
               _RWLock.EnterWriteLock();
                try
                {
                    writeDB();
                }
                finally
                {
                    _RWLock.EnterWriteLock();
                }             _RWLock.EnterReadLock();
                 try
                 {
                     readDB();
                 }
                 finally
                 {
                     _RWLock.ExitReadLock();
                 }