2

私はマルチスレッドでそのようなコードを使用しています:

古い例:

  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 ;
                       ...
                    }
                }


        }
}

また、数学関数が狂った結果をもたらすこともあります。

4

2 に答える 2

4

resは共有変数ではないため、ロックは意味がありません。そのスコープはロック内にのみ存在するため、他のスレッドはアクセスできません。

于 2012-07-30T14:54:46.707 に答える
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);
    }
 }
于 2012-07-30T14:55:18.613 に答える