static void locks() { var m_t_variable = 1; Volatile.Write(ref m_t_variable, 99); var yi = Thread.Yield(); if (!yi) { Console.WriteLine("there is no other threads to execute :("); } //Thread.SpinWait(111222333); // READ Win32- эквиваленты:.Sleep,.SwitchToThread.и.YieldProcessor var sl = new SpinLock(); Console.WriteLine(sl.GetHashCode()); var sl_lock = false; sl.Enter(ref sl_lock); sl.Exit(); //sl.TryEnter(ref sl_lock); // use anither sl_lock! or set to false //var are = new ManualResetEvent(false); var are = new AutoResetEvent(false); //var are = new AutoResetEvent(true); new Thread(_ => { Thread.Sleep(100); Console.WriteLine("are.Set ..."); are.Set(); Console.WriteLine("are.Set DONE"); }).Start(); new Thread(_ => { Console.WriteLine("are.WaitOne t2 ..."); are.WaitOne(); Console.WriteLine("are.WaitOne t2 DONE"); }).Start(); are.WaitOne(); Console.WriteLine("WaitOne DONE"); // are.Dispose(); //are.WaitOne(); //Console.WriteLine("WaitOne 2 DONE"); // will not run if u use AutoResetEvent. because it resets event automatically. var sf = new Semaphore(10, 10); // like an empty bus :) //sf.Release(); // err var mx = new Mutex(); //mx.WaitOne(); mx.WaitOne(); // runs anyway new Thread(_ => { mx.WaitOne(); //mx.ReleaseMutex(); Thread.Sleep(100); Thread.Sleep(100); Console.WriteLine("[mx] new Thread closing ..."); }).Start(); Thread.Sleep(100); //mx.WaitOne();// ERR because other thread is abandoned mx //mx.ReleaseMutex(); mx.WaitOne(); mx.ReleaseMutex(); var q = new BlockingQueue <int>(); new Thread(_ => { Console.WriteLine("[Queue] new Thread ..."); q.Enqueue(2); }).Start(); //Thread.Sleep(10); q.Dequeue(); }