public static class InterlockedEx
{
// AddToTotal safely adds a value to the running total.
public static float Add(ref float totalValue,float addend)
{
float initialValue, computedValue;
do
{
// Save the current running total in a local variable.
initialValue = totalValue;
// Add the new value to the running total.
computedValue = initialValue + addend;
// CompareExchange compares totalValue to initialValue. If
// they are not equal, then another thread has updated the
// running total since this loop started. CompareExchange
// does not update totalValue. CompareExchange returns the
// contents of totalValue, which do not equal initialValue,
// so the loop executes again.
} while (initialValue != Interlocked.CompareExchange(
ref totalValue, computedValue, initialValue));
// If no other thread updated the running total, then
// totalValue and initialValue are equal when CompareExchange
// compares them, and computedValue is stored in totalValue.
// CompareExchange returns the value that was in totalValue
// before the update, which is equal to initialValue, so the
// loop ends.
// The function returns computedValue, not totalValue, because
// totalValue could be changed by another thread between
// the time the loop ends and the function returns.
return computedValue;
}
}
'Interlocked.Add(ref int32、int32)またはInterlocked.Add(ref int64、int64)'のように追加を呼び出すことができます
私はそれを次のように呼びました:InterlockedEx.Add(ref subtotalVolume [i]、v.Volume);
アドバイスを与えることができる人は、とにかくそれを正しく実行させます。
関数の結果は通常の関数と等しくありません(TPLを使用しないでください)。