网站带后台,国内vps做网站要备案吗,网页设计与制作课程教学大纲,wordpress 留言插件除了Lock#xff08;#xff09;、Monitor之外#xff0c;我们最长用的就是Mutex了#xff0c;但是玩不好Mutex就总会造成死锁或者AbandonedMutexException#xff08;我就玩的不怎么好#xff0c;在并发性访问测试的时候总是遇到关于Mutex的问题#xff0c;各位线虫见笑…除了Lock、Monitor之外我们最长用的就是Mutex了但是玩不好Mutex就总会造成死锁或者AbandonedMutexException我就玩的不怎么好在并发性访问测试的时候总是遇到关于Mutex的问题各位线虫见笑了不过还是把我遇到的一些问题和总结拿出来和大家分享有误的地方还往指正。 还是先举一个简单的例子来说明一下这个东西 public class ThreadMutex { public void Test() { Thread t1 new Thread(Thread1); Thread t2 new Thread(Thread2); t1.Start(); t2.Start(); } public void Thread1() { Mutex m new Mutex(false, test); bool b2 m.WaitOne(); Console.WriteLine(Thread1 get the mutex : b2); Thread.Sleep(10000); m.ReleaseMutex(); } public void Thread2() { Mutex m new Mutex(false, test); bool b2 m.WaitOne(); Console.WriteLine(Thread2 get the mutex : b2); Thread.Sleep(1000); m.ReleaseMutex(); }} 恩Thread1中Mutex.WaitOne()后就想到与Thread1拿到了Mutex所有权这时Thread2得到了同样的Mutex然后Mutex.WaitOne()也想拿到Mutex的所有权这时就必须等待了。这里只需要两点就能明白什么是Mutex了 1. Mutex是一个令牌当一个线程拿到这个令牌时运行另外想拿到令牌的线程就必须等待直到拿到令牌的线程释放令牌。没有所有权的线程是无法释放令牌的。 2. Mutexfalse”string”中的string是令牌的关键或者可以叫令牌名因为Mutex是跨进程的整个系统中只会有唯一的令牌存在所以也就是说你在一个应用程序中的一个线程中得到了Mutex的所有权那在另外一个线程中的另外的线程想得到他就必须要等待。 要弄清楚Mutex就还需要弄清楚两个很重要的问题 1那就是Mutex是调用的Win32 的API HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName ); 这就是他为什么能跨进程访问的原因正是由于它使用P/Invoke他的效率问题就凸现出来明显不如Monitor之类的快用的时候还需多多斟酌。 下面放一个Mutex的简单实现看看Mutex在.net下是如何实现的。 2Mutex的生命周期这个问题让我郁闷了很久因为不太了解Mutex的机制使得我也没法弄清楚到底能活多长时间这也是AbandonedMutexException经常会出现的原因。还是先来看一段程序 public class ThreadMutex { public void Test() { Thread t1 new Thread(Thread1); Thread t2 new Thread(Thread2); t1.Start(); t2.Start(); } public void Thread1() { Mutex m new Mutex(false, test); bool b2 m.WaitOne(); Console.WriteLine(Thread1 get the mutex : b2); } public void Thread2() { Thread.Sleep(10);//保证Thread1执行完 Mutex m new Mutex(false, test); bool b2m.WaitOne(); Console.WriteLine(b2); m.ReleaseMutex(); }} 在Thread2中的WaitOne()方法就会报错了AbandonedMutexException原因就是Thread1拿到了Mutex后没有释放Thread1就结束了这样Mutex成了被抛弃的地孩子了呵呵。但是如果垃圾收集了就不一样咯。代码稍微修改了一下 public class ThreadMutex { public void Test() { Thread t1 new Thread(Thread1); Thread t2 new Thread(Thread2); t1.Start(); t2.Start(); } public void Thread1() { Mutex m new Mutex(false, test); bool b2 m.WaitOne(); Console.WriteLine(Thread1 get the mutex : b2); } public void Thread2() { Thread.Sleep(10);//保证Thread1执行完 GC.Collect(); GC.WaitForPendingFinalizers(); bool b1; Mutex m new Mutex(false, test,out b1); Console.WriteLine(b1); bool b2m.WaitOne(); Console.WriteLine(b2); m.ReleaseMutex(); } } 结果是 Thread1 get the mutex : True True True Thread2里面的Mutex是新创建的呵呵这里面的玄妙自己体会吧。 最后要说一下的是Mutex的访问和window访问文件的机制基本上是一样的window访问对象和访问文件使用的是同样的安全机制虽然我还没看懂。