0

マルチスレッド タイマー配列があり、それぞれが同じ関数を呼び出しています。同じタスクを実行しますが、関数に異なる値を渡します。ただし、他のスレッドが同時に値を渡すため、価格の計算は正確ではありません。これを効率的に解決する方法について、私は int ID を渡して特定するのが異なる計算であるという考えを持っています。

   ListOfValue ListOfValue[ListOfValue.ID] = ListOfValue;
   double totalPriceSolve[ListOfValue.ID] = 
          ListOfValue[ListOfValue.ID].priceA + ListOfValue[ListOfValue.ID].PriceB;

しかし、上記のソリューションでは、すべてのデータを配列に変換する効率が悪く、スレッドセーフかどうかわかりません。

以下の計算は短すぎて問題が見えない可能性があるため、デモの例を単純化します。

System.Threading.Timer[] timerThread = new System.Threading.Timer[10]; 

for(int i=0; i< 10; i++){
    timerThread[i] = new System.Threading.Timer(
                     new TimerCallback(MultiTimerTick2), ListOfValue ,2000, 2000);
}

private void MultiTimerTick2(object obj){
    ListOfValue ListOfValue = (ListOfValue)obj;
    //Perform job like read data from database, after calculation insert into database
    double totalPrice = ListOfValue.priceA + ListOfValue.PriceB;
}
4

1 に答える 1

0

あなたのコード変数はスレッドセーフのようで、配列を操作していて、それを変更していません。私は2つの問題を見ることができます:

1) double を使用して計算します。通常、 double は財務計算には正確ではありません (Alexei が述べたように)。

2)データベースからデータを読み書きしているので、実際にはロックを使用していないため安全ではありません。そのため、次のような状況が発生する可能性があります。

Thread1 read A from DB
Thread2 read A from DB
Thread1 modify A based on read value
Thread1 write A to DB
Thread2 modify A based on read (old) value
Thread2 write A to DB
于 2013-03-22T05:59:43.087 に答える