定时器多线程数组共用一个函数的问题
本文关键字:一个 函数 问题 数组 多线程 定时器 | 更新日期: 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