0

我有一个多线程计时器数组,每个都调用相同的函数。执行相同的任务,但将不同的值传递给函数。但是由于其他线程同时传入值,价格计算不准确。如何有效地解决这个问题,我有一个想法是传入一个 int ID 来识别不同的计算。

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

但上述解决方案我认为看起来效率不高,将所有数据转换为数组,我不确定是否是线程安全的。

简化 Demo 示例如下计算太短可能看不到问题。

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

您的代码变量似乎是线程安全的,您使用数组并且您不修改它。我可以看到两个问题:

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 回答