当前位置: 代码迷 >> C# >> C#多线程开发八:线程同步之Mutex类
  详细解决方案

C#多线程开发八:线程同步之Mutex类

热度:65   发布时间:2016-05-05 03:39:48.0
C#多线程开发8:线程同步之Mutex类

以下代码模拟“从自动取款机中取钱”的操作:当账户余额大于等于1000时,取出1000放入口袋。代码中使用两个线程同时执行取钱操作,若不进行同步处理,可能会存在两个线程同时进入取钱逻辑,导致最终取出2000的错误结果。所以代码中使用Mutex类同步线程访问取钱逻辑(临界资源)。

using System;using System.Threading;namespace MutexExample{    class Program    {        private static Mutex mutex = new Mutex();        public static int account = 1000;//账户        public static int pocket = 0;//口袋        static void Main(string[] args)        {            Thread t1 = new Thread(DoWork);            t1.Start();            Thread t2 = new Thread(DoWork);            t2.Start();            t1.Join();            t2.Join();            Console.WriteLine("pocket=" + pocket);        }        public static void DoWork()        {            if (mutex.WaitOne())            {                try                {                    if (account >= 1000)                    {                        Thread.Sleep(1000);//自动取款机打了个小盹                        account -= 1000;                        pocket += 1000;                    }                }                finally                {                    mutex.ReleaseMutex();                }            }        }    }}
调用Mutex类的WaitOne()方法获得互斥锁定,调用Mutex类的ReleaseMutex()方法释放互斥锁定。

Mutex类与Monitor类类似,每次只有一个线程能拥有互斥锁定,这意味着,每次只有一个线程能访问受互斥保护的临界资源。Mutex类与Monitor类的不同之处是:Mutex类提供了跨多个进程同步访问的功能,在Mutex类的构造函数中可以为互斥指定名称,命名的互斥可以被不同的进程共享,因为操作系统能够识别有名称的互斥;如果没有给互斥指定名称,互斥就是未命名的,在不同的进程之间不能共享,只能在一个进程内起作用。本文实例使用的是未命名的互斥,对进程内的线程进行同步。