如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
HYPERLINK"http://blog.csdn.net/davyfamer/archive/2007/02/08/1505449.aspx"c#多线程编程笔记3a)使用Mutex类Mutex是一个特殊的同步类,只能用来同步线程,不过Mutex可以跨进程对线程进行同步。Mutex类确保了一次只有一个线程可以访问同一资源。MSDN中的描述如下:“Mutex是同步基元,它只向一个线程授予对共享资源的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。”对互斥体,MSDN有如下描述:“互斥体有两种类型:局部互斥体和已命名的系统互斥体。如果使用接受名称的构造函数创建Mutex对象,则该对象与具有该名称的操作系统对象关联。已命名的系统互斥体在整个操作系统中都可见,可用于同步进程活动。您可以创建多个Mutex对象来表示同一个已命名的系统互斥体,也可以使用HYPERLINK"ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref12/html/O_T_System_Threading_Mutex_OpenExisting.htm"OpenExisting方法打开现有的已命名系统互斥体。局部互斥体仅存在于您的进程内。您的进程中任何引用局部Mutex对象的线程都可以使用它。每个Mutex对象都是一个单独的局部互斥体。”例子4:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Threading;namespaceConsoleApplication1{classmutex4{privatestaticMutexmut=newMutex();privateconstintnumIterations=1;privateconstintnumTreads=3;staticvoidMain(){ThreadmyThread=newThread(newThreadStart(MyThreadProc));myThread.Name="Thread";ThreadmyThread1=newThread(newThreadStart(MyThreadProc));myThread1.Name="Thread1";ThreadmyThread2=newThread(newThreadStart(MyThreadProc));myThread2.Name="Thread2";myThread.Start();myThread1.Start();myThread2.Start();}privatestaticvoidMyThreadProc(){for(inti=0;i<numIterations;i++){UseResource();}}privatestaticvoidUseResource(){//mut.WaitOne();Console.WriteLine("{0}hasenteredtheprotectedarea",Thread.CurrentThread.Name);Thread.Sleep(500);Console.WriteLine("{0}isleavingtheprotectedarea\r\n",Thread.CurrentThread.Name);//mut.ReleaseMutex();}}}这个程序没有加入mut同步机制,运行结果如下:如果我们把mut.WaitOne()与mut.ReleaseMutex()前的//去掉,运行结果如下:可以看出,这样线程就完全按我们运行的顺序运行了!在这里值得一提的是Mutex.WaitOne有三种重载方法:Mutex.WaitOne();Mutex.WaitOne(int[millisecondTimeOut],bool[exitContext]),Mutex.WaitOne(TimeSpan[timeout],bool[exitContext])其中第一参数是指超时的时间限止,第二个参数指定了线程在重新获取同步上下文之前是否需要先退出同步。例子5:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Threading;namespaceConsoleApplication1{classmutexWaitOne5{staticAu