3

我在计算,比如说,纳斯达克指数。

所有股票价格都是十进制的,我可以将重量设为十进制或双倍 - 没关系。

纳斯达克 = 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这样我才能继续使用我的“智能缓存算法”,所以我必须使用更复杂的“同步”机制,可能我必须使用自旋锁。

可能您可以看到更简单的解决方案?

4

0 回答 0