public void TestTinyLock_Lock() { var tl = new TinyLock(); const int count = 100000000; Stopwatch sw = new Stopwatch(); sw.Start(); for (int x = 0; x < count; x++) { using (tl.Lock()) ; using (tl.Lock()) ; using (tl.Lock()) ; using (tl.Lock()) ; using (tl.Lock()) ; using (tl.Lock()) ; using (tl.Lock()) ; using (tl.Lock()) ; using (tl.Lock()) ; using (tl.Lock()) ; } sw.Stop(); Console.WriteLine((count * 10.0 / sw.Elapsed.TotalSeconds / 1000000)); }
internal TinyLockRelease(TinyLock tinyLock) { if ((object)tinyLock == null) { throw new ArgumentNullException("tinyLock"); } if (tinyLock.m_release.m_tinyLock != null) { throw new Exception("Object is already locked"); } m_tinyLock = tinyLock; }
public void TestContention() { m_value = 0; m_sync = new TinyLock(); m_event = new ManualResetEvent(true); for (int x = 0; x < 16; x++) ThreadPool.QueueUserWorkItem(Adder); Thread.Sleep(100); m_event.Set(); while (m_value < 16 * max) { Console.WriteLine(m_value); Thread.Sleep(1000); } Console.WriteLine(m_value); }
internal TinyLockRelease(TinyLock tinyLock) { if ((object)tinyLock == null) throw new ArgumentNullException("tinyLock"); if (tinyLock.m_release.m_tinyLock != null) throw new Exception("Object is already locked"); m_tinyLock = tinyLock; }