SimpleSpinLock ssl = new SimpleSpinLock(); for (Int32 i = 0; i < iterations; i++) { ssl.Enter(); x++; ssl.Leave(); } Console.WriteLine("Incrementing x in SimpleSpinLock: {0:N0}", sw.ElapsedMilliseconds); using (SimpleWaitLock swl = new SimpleWaitLock()) { sw = Stopwatch.StartNew(); for (Int32 i = 0; i < iterations; i++) { swl.Enter(); x++; swl.Leave(); } Console.WriteLine("Incrementing x in SimpleWaitLock: {0:N0}", sw.ElapsedMilliseconds); } } }
struct SimpleSpinLock { private Int32 m_ResourceInUse; public void Enter() { while (Interlocked.Exchange(ref m_ResourceInUse, 1) != 0) { } } public void Leave() { Thread.VolatileWrite(ref m_ResourceInUse, 0); } }
class SimpleWaitLock : IDisposable { private AutoResetEvent m_ResourceFree = new AutoResetEvent(true); public void Enter() { m_ResourceFree.WaitOne(); } public void Leave() { m_ResourceFree.Set(); } public void Dispose() { m_ResourceFree.Close(); } }