• Mutex


    一个同步基元,也可用于进程间同步。 

    即进程同步 当然也可以线程同步 

    所以在线程同步角度来说,Monitor开销小,优于Mutex,

    要实现进程同步,Monitor也干不了,Mutex是首选。

    MSDN 实例:

    This example shows how a Mutex is used to synchronize access
    to a protected resource. Unlike Monitor, Mutex can be used with
    WaitHandle.WaitAll and WaitAny, and can be passed across
    AppDomain boundaries.

    using System;
    using System.Threading;
    
    class Test
    {
        // Create a new Mutex. The creating thread does not own the
        // Mutex.
        private static Mutex mut = new Mutex();
        private const int numIterations = 1;
        private const int numThreads = 3;
    
        static void Main()
        {
            // Create the threads that will use the protected resource.
            for(int i = 0; i < numThreads; i++)
            {
                Thread myThread = new Thread(new ThreadStart(MyThreadProc));
                myThread.Name = String.Format("Thread{0}", i + 1);
                myThread.Start();
            }
    
            // The main thread exits, but the application continues to
            // run until all foreground threads have exited.
        }
    
        private static void MyThreadProc()
        {
            for(int i = 0; i < numIterations; i++)
            {
                UseResource();
            }
        }
    
        // This method represents a resource that must be synchronized
        // so that only one thread at a time can enter.
        private static void UseResource()
        {
            // Wait until it is safe to enter.
            mut.WaitOne();
    
            Console.WriteLine("{0} has entered the protected area", 
                Thread.CurrentThread.Name);
    
            // Place code to access non-reentrant resources here.
    
            // Simulate some work.
            Thread.Sleep(500);
    
            Console.WriteLine("{0} is leaving the protected area
    ", 
                Thread.CurrentThread.Name);
    
            // Release the Mutex.
            mut.ReleaseMutex();
        }
    }
        class Program
        {
            static void Main(string[] args)
            {
                for (int i = 0; i < 20; i++)
                {
                    Thread t = new Thread(Run);
    
                    t.Start();
                }
    
                Console.Read();
            }
    
            static int count = 0;
    
            static Mutex mutex = new Mutex();
    
            static void Run()
            {
                Thread.Sleep(100);
    
                mutex.WaitOne();
    
                Console.WriteLine("当前数字:{0}", ++count);
    
                mutex.ReleaseMutex();
            }
        }

    进程同步运行2个exe实例:

        class Program
        {
            static void Main(string[] args)
            {
                Thread t = new Thread(Run);
    
                t.Start();
    
                Console.Read();
            }
    
            static Mutex mutex = new Mutex(false, "tsp");
    
            static void Run()
            {
                mutex.WaitOne();
    
                Console.WriteLine("当前时间:{0}我是线程:{1},我已经进去临界区", DateTime.Now, Thread.CurrentThread.GetHashCode());
    
                Thread.Sleep(10000);
    
                Console.WriteLine("
    当前时间:{0}我是线程:{1},我准备退出临界区", DateTime.Now, Thread.CurrentThread.GetHashCode());
    
                mutex.ReleaseMutex();
            }
        }

    延伸 同理 一个运行程序只希望启动一个实例:

    查看msdn

        public partial class App : System.Windows.Application
        {
            Mutex mutex;
    
            public App()
            {
                this.Startup += new StartupEventHandler(App_Startup);
            }
    
            void App_Startup(object sender, StartupEventArgs e)
            {
                bool ret;
                mutex = new Mutex(false, Process.GetCurrentProcess().ProcessName, out ret);
                if (!ret)
                {
                    MessageBox.Show("程序已打开", "", MessageBoxButton.OK, MessageBoxImage.Stop);
                    Environment.Exit(0);
                }
            }
        }
  • 相关阅读:
    poj 3466 A Simple Problem with Integers
    java运行脚本语言demo
    Good Bye 2013---B. New Year Present
    游标-----内存中的一块区域,存放的是select 的结果
    Oracle 游标使用全解
    Oracle系列:记录Record
    10大协作办公工具:实现团队工作效率最大化
    如何有效使用Project(1)——编制进度计划、保存基准
    多项目同时进行如何做好进度管理
    @RISK
  • 原文地址:https://www.cnblogs.com/y112102/p/3723512.html
Copyright © 2020-2023  润新知