C#学习之多线程开发技术(八) 忘是亡心i 2022-08-09 02:25 71阅读 0赞 **线程同步之Mutex类** 在Framework中已经为我们提供了三个加锁的机制,分别是 Monitor类 Lock关键字 Mutex类 都是锁定数据或是锁定被调用的函数。 Mutex则多用于锁定多线程间的同步调用。简单的说,Monitor和Lock多用于锁定被调用端,而Mutex则多用锁定调用端。 Monitor和Lock将代码段标记为临界区,其实现原理是首先锁定某一私有对象,然后执行代码段中的语句,当代码段中的语句执行完毕后,再解除锁。 # **----------------------Mutex类概述** # **Mutex是一个继承于WaitHandle的类,它必须实现一个信号量机制表明排他地占用或释放资源。 同一时间,只能有一个线程占用Mutex。 在访问资源之前,每个线程都通过发信号,以获得Mutex的控制权。此后,线程还必须等待资源的控制权。当线程完成操作时,通过ReleaseMutex()发出完成信号** **(lock和Monitor对于unmanaged 资源是不起作用的。 .Net Framework提供了Finalize()方法,它允许在垃圾回收器回收该类资源时,适当的清理非托管资源。 常见的非托管资源:ApplicationContext,Brush,Componet,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,** **OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 等等资源。可能在使用的时候很多都没有注意到!)** ## **-------------------举例(控制台程序)** ## **例如在下面的程序中,有两个线程thread1和thread2, 和一个TestFunc函数,TestFunc函数会打印出调用它的线程和调用的时间,两个线程分别以30ms和100ms的时间间隔来调用TestFunc这个函数。** 提示:使用 mutex ,请加上如下的名称空间 using System.Threading; ## \-------------------代码展示 ## using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace 线程同步mutex { class Program { #region 变量区 private static Mutex mutex = new Mutex(); private const int nulIterations = 1; private const int numThreads = 3; #endregion static void Main(string[] args) { ///--创建线程以利用受保护的资源 for (int i = 0; i < numThreads; i++) { ///---创建线程 Thread myThread = new Thread(new ThreadStart(MyThreadProc)); myThread.Name = string.Format("线程{0}", i + 1); myThread.Start(); } } ///---线程方法 private static void MyThreadProc() { for (int i = 0; i < nulIterations; i++) { UserResource(); } } ///--该方法每次只能由一个线程访问的同步代码 private static void UserResource() { ///---直到安全进入之前一直等待 mutex.WaitOne(); Console.WriteLine("{0} 进入代码保护区", Thread.CurrentThread.Name); ///---放置访问不经饿重入的代码 ///---不可重入函数不能由超过一个任务所共享,除非能确保函数的互斥 ///---模拟操作 Console.WriteLine("模拟耗时的操作,延迟3秒....."); Thread.Sleep(3000); Console.WriteLine("{0} 离开代码保护区\n", Thread.CurrentThread.Name); ///---释放mutex mutex.ReleaseMutex(); } } } 下面是输出结果: ![Center][] [Center]: /images/20220731/91e604942f114b69a216cc091f78605e.png
还没有评论,来说两句吧...