private void EnterMyLockSpin() { int pc = Environment.ProcessorCount; for (int i = 0; ; i++) { if (i < LockSpinCount && pc > 1) { Helpers.Spin(LockSpinCycles * (i + 1)); // Wait a few dozen instructions to let another processor release lock. } else if (i < (LockSpinCount + LockSleep0Count)) { Helpers.Sleep(0); // Give up my quantum. } else { Helpers.Sleep(1); // Give up my quantum. } if (_myLock == 0 && Interlocked.CompareExchange(ref _myLock, 1, 0) == 0) { return; } } }
private static void SpinWait(int SpinCount) { //Exponential backoff if ((SpinCount < 5) && (Environment.ProcessorCount > 1)) { Helpers.Spin(LockSpinCycles * SpinCount); } else if (SpinCount < MaxSpinCount - 3) { Helpers.Sleep(0); } else { Helpers.Sleep(1); } }