Esempio n. 1
0
        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();
        }