C#学习之多线程开发技术(八)

来源:互联网 发布:产品经理和数据分析 编辑:程序博客网 时间:2024/04/16 12:44

线程同步之Mutex

     在Framework中已经为我们提供了三个加锁的机制,分别是
           Monitor
           Lock关键字
           Mutex类 
     都是锁定数据或是锁定被调用的函数
     Mutex则多用于锁定多线程间的同步调用。简单的说,MonitorLock多用于锁定被调用端,而Mutex则多用锁定调用端。
     MonitorLock将代码段标记为临界区,其实现原理是首先锁定某一私有对象,然后执行代码段中的语句,当代码段中的语句执行完毕后,再解除锁。

----------------------Mutex类概述

       Mutex是一个继承于WaitHandle的类,它必须实现一个信号量机制表明排他地占用或释放资源。
        同一时间,只能有一个线程占用
Mutex
       在访问资源之前,每个线程都通过发信号,以获得
Mutex的控制权。此后,线程还必须等待资源的控制权。当线程完成操作时,通过ReleaseMutex()发出完成信号
lockMonitor对于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等等资源。可能在使用的时候很多都没有注意到! 

-------------------举例(控制台程序)

     例如在下面的程序中,有两个线程thread1thread2, 和一个TestFunc函数,TestFunc函数会打印出调用它的线程和调用的时间,两个线程分别以30ms100ms的时间间隔来调用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();        }    }}
     下面是输出结果:

0 0
原创粉丝点击