多线程中的Math类会产生错误

时间:2012-07-30 14:51:02

标签: c# .net multithreading xamarin.android

我在多线程中使用这样的代码:

旧例子:

  class All
     {
        object lockAll = new object();
        public All ()
        {
           lock(lockAll)
           {
               double res= Magnitude(1d, 0.1d , 0.2d);
           }
        }
        private double Magnitude(double X, double Y, double Z)
        {
           return Math.Sqrt(X * X + Y * Y + Z * Z);
        }
     }

但是我看到有时res是1.3 * 10 ^ -314。为什么???全部被锁定: 真实代码的一部分:

class PointSensors : IDisposable
    {
object lockAcs = new object(); //Can it be non static? I think yes
object lockMag = new object();
// When i got info from sensors. Multitheading method called many times every time in new thread
 public void OnSensorChanged(SensorEvent ev)
        {
            Sensor curS = ev.Sensor;
            long timeStamp = ev.Timestamp;
              // Vector from sensors
             Vector3 vector = new Vector3(ev.Values[0], ev.Values[1], ev.Values[2]);
                if (curS.Type == SensorType.Accelerometer)
                {
                    lock (lockAcs)
                    {
                       double TotalAcseleration = vector.Magnitude - 9.8d;
                       ...
                    }
                }

                if (curS.Type == SensorType.MagneticField))
                {
                    lock (lockMag)
                    {
                       double TotalMagVect = vector.Magnitude ;
                       ...
                    }
                }


        }
}

有时数学函数会产生疯狂的结果。

2 个答案:

答案 0 :(得分:4)

由于res不是共享变量,因此您的锁没有意义。它的范围只存在于锁中,因此无论如何其他线程都无法访问它。

答案 1 :(得分:3)

因为您锁定了不同的实例。锁定你的锁。

class All
 {
    private static object lockAll = new object();
    public All ()
    {
       lock(lockAll)
       {
           double res= Magnitude(1d, 0.1d , 0.2d);
       }
    }
    private double Magnitude(double X, double Y, double Z)
    {
       return Math.Sqrt(X * X + Y * Y + Z * Z);
    }
 }