现在面临个问题,就是两个线程分别通过两个串口来读取数据,读取完数据后,处理数据采用同一个函数的话,采用参数来判定是哪个线程,分别存储,然后再把两个串口存储的数据结合起来,输出。不知道这种处理存在线程互斥和同步的问题不?数据还是有点问题的,谢谢各位大侠。

解决方案 »

  1.   

    不写入文件,是写入同一个对象的比如说对象组chunnel,而每个chunnel的对象下面包含这两个串口的存入的对象组ser1和ser2,但是发现串口2的数据本身应该是chunnel[2]对象中的数据,结果chunnel[1]中也有这数据了,不知道是怎么回事,谢谢
      

  2.   

    你的问题可不可以理解成:用两个线程并发调用一个函数,这个函数根据不同线程做不同操作,最后等所有线程结束后,再进行其他操作。如下我写的类似模拟代码 //
            // 开头需加入using System.Threading
            // VS2008 编译通过
            //
            static int a;
            static int b;        static void Main()
            {
                Thread th1 = new Thread(Doo);
                Thread th2 = new Thread(Doo);
                Console.WriteLine("开始多线程操作");
                th1.Start(1);
                th2.Start(2);            th1.Join();
                th2.Join();
                Console.WriteLine("操作完成");
                Console.WriteLine("结果" + (a + b));
            }        static void Doo(object obj)
            {
                if (obj is int && (int)obj == 1)
                {
                    Console.WriteLine("正在操作类型1");
                    Thread.Sleep(1000);
                    a = 18;
                }
                else
                {                Console.WriteLine("正在操作类型2");
                    Thread.Sleep(400);
                    b = 20;
                }
            }
      

  3.   

    不是你这么理解的,你得仔细考虑细节一个串口时,串口线程往buffer里写数据,写数据是需要一个过程的(假如你的数据超过4字节,小于4字节,且内存对齐时,32位机上不会出问题),这时候主线程里碰巧读数据,这时候读出的数据可能错位,前半截是新数据,后半截是旧数据,概率极小,数据会突然乱一下。所以写数据,读数据就需要加锁。我倒是在想,两个串口,单独的缓冲区,会出现像一个串口一个缓冲区那样的问题,因为缓冲区的独立,不需要特殊维护的。
    数据填错了,你最好加断点仔细调试下,八成你的问题。记得加锁,各锁各的缓冲区,别死锁了
      

  4.   

    我现在的处理是一个串口读出来数据比如说放在一个对象的缓冲区内,另外一个线程读出来数据直接放在这个对象缓冲区的后面,而主线程使用数据的时候直接取这个对象的数据就行了,可是我把后面串口读数据之前加了无论是lock还是monitor锁住这个对象,发现运行出来的结果是一样的,难道锁用的不对?只是跟以前的现象不同的是,通道之间的数据不会混了,只是另外一个串口读出来有数据的时候,比如说就一组数据,在这个通道中会出现相同的数据几个,而且数目不定,
      

  5.   

    lock跟monitor都试过了,貌似没效果,被调用的函数是往全局对象中存储数据,所以应该要同步吧?
      

  6.   

    下面是其中一个串口处理数据,接着另外一个串口存数据,大家帮忙看看锁用的有问题没?谢谢   
     private void DoSubMainChuTrim()
            {
                
                int chunnelCod = (int)(this._subMainRecBytes[_state_chu_cod] - 0x01);
                // 报文有误
                if (Super.Validate.ValidateChunnelCod(chunnelCod) == false)
                {
                    return;
                }
              
               // {
                Chunnel chunnel = DataBase.chunnels[chunnelCod];           
                lock (chunnel)
                // Monitor.Enter(chunnel);
                {
                    chunnel.SubMainNum= this._subMainRecBytes[_state_length] - 0x06;
                    chunnel.SubMainNum /= 0x04;
                    // 报文有误
                    if (Super.Validate.ValidateProbeNum(chunnel.SubMainNum) == false)
                    {
                        return;
                    }
                    chunnel.Status = true;
                    Probe probe;
                    // waveData
                    Byte[] blist = new Byte[4];
                    for (int i = 0; i < chunnel.SubMainNum; ++i)
                    {
                        probe = chunnel.Probes[i+chunnel.Num];
                        blist[3] = _wave_first_byte;
                        blist[2] = this._subMainRecBytes[_state_chu_data + i * 0x04 + 0x00];
                        blist[1] = this._subMainRecBytes[_state_chu_data + i * 0x04 + 0x01];
                        blist[0] = this._subMainRecBytes[_state_chu_data + i * 0x04 + 0x02];
                        probe.Wave = BitConverter.ToSingle(blist, 0);
                        probe.Atten = this._subMainRecBytes[_state_chu_data + i * 0x04 + 0x03] * (-1);
                    }
                    chunnel.Num += chunnel.SubMainNum;
                }           //Monitor.Exit(chunnel);
            }
      

  7.   

    两个线程lock 的 chunnel 不一样吧
      

  8.   

    两个线程都都需要lock吗?不是一个线程lock了这个对象,另外一个线程就不可以访问了吗,等这个访问完了另外一个才能操作?