你的位置:首页 > 软件开发 > ASP.net > 线程同步方式之互斥量Mutex

线程同步方式之互斥量Mutex

发布时间:2016-07-01 18:00:02
互斥量和临界区非常相似,只有拥有了互斥对象的线程才可以访问共享资源,而互斥对象只有一个,因此可以保证同一时刻有且仅有一个线程可以访问共享资源,达到线程同步的目的。互斥量相对于临界区更为高级,可以对互斥量进行命名,支持跨进程的线程同步。互斥量是调用的Win32的API对互斥锁的操作 ...

互斥量和临界区非常相似,只有拥有了互斥对象的get='_blank'>线程才可以访问共享资源,而互斥对象只有一个,因此可以保证同一时刻有且仅有一个线程可以访问共享资源,达到线程同步的目的。

互斥量相对于临界区更为高级,可以对互斥量进行命名,支持跨进程的线程同步。互斥量是调用的Win32的API对互斥锁的操作,因此在同一操作系统下不同进程可以按照互斥锁的名称共享锁。

正因为如此,互斥锁的操作会更好资源,性能上相对于临界区也有降低,在使用时还要多斟酌。对于进程内的线程同步使用临界区性能会更佳。

在.Net中使用Mutex类来表示互斥量,使用实例的WaitOne()阻止线程执行至到获取Mutex对象,ReleaseMutex()释放锁资源,我们来看一下示例

class MutexTest    {        //创建Mutex对象        private static Mutex mutex = new Mutex(true, "My");        //        static void Main(string[] args)        {            Run();            Console.ReadLine();        }        //模拟多线程调用        public static void Run()        {            const int count = 2;            var threads = new Thread[count];            for (var i = 0; i < count; i++)            {                var ts = new ThreadStart(UserResource);                var t = new Thread(ts);                t.Name = "thread" + (i + 1);                threads[i] = t;            }            foreach (var t in threads)            {                t.Start();            }            //            Console.WriteLine(string.Format("Creating thread {0} owns the Mutex.", Thread.CurrentThread.Name));            Thread.Sleep(1000);            mutex.ReleaseMutex();            Console.WriteLine(string.Format("Creating thread {0} releases the Mutex.", Thread.CurrentThread.Name));        }        //修改共享资源值        public static void UserResource()        {            mutex.WaitOne();            Console.WriteLine(string.Format("Child thread named {0} owns the mutex.", Thread.CurrentThread.Name));            Thread.Sleep(1000);            mutex.ReleaseMutex();            Console.WriteLine(string.Format("Child thread named {0} releases the mutex.", Thread.CurrentThread.Name));        }    }

原标题:线程同步方式之互斥量Mutex

关键词:线程

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。