我在计算,比如说,纳斯达克指数。
所有股票价格都是十进制的,我可以将重量设为十进制或双倍 - 没关系。
纳斯达克 = weight1 * stock1 + weight2 * stock2 + .... + weightn * stockn。
由于股票价格是十进制的,因此将纳斯达克指数设为十进制似乎是有意义的。但我不想每次更新某些股票时都重新计算纳斯达克指数。相反,我想“缓存”以前的值,然后只计算差异。例如,如果 stock2 更改,则:
stock2OldPrice = stocks[2];
diff = stock2 - stock2OldPrice
nasdaq += diff * weight2 // need to synchronize
stocks[2] = stock2
现在我需要同步纳斯达克指数,因为股票可以同时更新。例如,我可以在并行线程中收到 MSFT 和 INTC 的新价格。所以我必须写Interlocked.Add(ref nasdaq, diff * weight2);
参考我之前的问题如何使用无锁代码同步来自不同线程的添加? 但是我不能这样做,decimal
因为不支持小数。
好的,让我们尝试将nasdaq
索引声明为double
? 使用双打我可以做到Interlocked.Add
,但现在有另一个问题:因为每一步我都会从十进制转换为双精度,我会失去精度。然后我的“智能缓存算法”不会绝对“精确”。这意味着在我的索引的 100 000 000 次更新值变得完全错误之后,我无法处理。
所以不可能使用也double
不可能decimal
。
我确实只看到了一种可能的解决方案——我必须声明 nasdaq 索引,decimal
这样我才能继续使用我的“智能缓存算法”,所以我必须使用更复杂的“同步”机制,可能我必须使用自旋锁。
可能您可以看到更简单的解决方案?