定时器多线程数组共用一个函数的问题

本文关键字:一个 函数 问题 数组 多线程 定时器 | 更新日期: 2023-09-27 18:05:19

我有一个多线程计时器数组,每个都调用相同的函数。执行相同的任务,但向函数传递不同的值。但由于同时有其他线程传入,价格计算不准确。如何有效的解决这个问题,我有一个想法是在一个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;
}

定时器多线程数组共用一个函数的问题

你的代码变量似乎是线程安全的,你的工作与数组,你不修改它。我可以看到两个问题:

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