void WithAtomicValUnmanaged_Entry() { for (var i = 0; i < NumIterations; i++) { var prevVal = _atomicValUnmanaged.Exchange(new Vector2(i, i)).PreviousValue; var curVal = _atomicValUnmanaged.TryExchange(new Vector2(prevVal.X + 2, prevVal.Y + 2), new Vector2(i, i)).CurrentValue; BenchmarkUtils.SimulateContention(ContentionLevel); prevVal = _atomicValUnmanaged.Exchange(new Vector2(curVal.X + 1, curVal.Y + 1)).PreviousValue; curVal = _atomicValUnmanaged.TryExchange(new Vector2(prevVal.X + 2, prevVal.Y + 2), new Vector2(i, i)).CurrentValue; BenchmarkUtils.SimulateContention(ContentionLevel); prevVal = _atomicValUnmanaged.Exchange(new Vector2(curVal.X + 1, curVal.Y + 1)).PreviousValue; _atomicValUnmanaged.TryExchange(new Vector2(prevVal.X + 2, prevVal.Y + 2), new Vector2(i, i)); BenchmarkUtils.SimulateContention(ContentionLevel); } }
void WithUnmanagedInt_Entry() { const int Bitmask = 0b101010101; for (var i = 0; i < NumIterations; ++i) { var incResult = _unmanagedInt.Exchange(curVal => curVal + 1); Assert(incResult.CurrentValue == incResult.PreviousValue + 1); var addResult = _unmanagedInt.Exchange(curVal => curVal + 10); Assert(addResult.CurrentValue == addResult.PreviousValue + 10); var subResult = _unmanagedInt.Exchange(curVal => curVal - 9); Assert(subResult.CurrentValue == subResult.PreviousValue - 9); var multResult = _unmanagedInt.Exchange(curVal => curVal * 3); Assert(multResult.CurrentValue == multResult.PreviousValue * 3); var divResult = _unmanagedInt.Exchange(curVal => curVal / 4); Assert(divResult.CurrentValue == divResult.PreviousValue / 4); var decResult = _unmanagedInt.Exchange(curVal => curVal - 1); Assert(decResult.CurrentValue == decResult.PreviousValue - 1); var exchangeResult = _unmanagedInt.Exchange(curVal => curVal & Bitmask); Assert(exchangeResult.CurrentValue == (exchangeResult.PreviousValue & Bitmask)); } }