<div class="postbody">
<span style="color: #ff99cc;"><span style="color: #ff0000;"> 除了Lock()、Monitor之外,我们最长用的就是Mutex了</span>,</span>但是玩不好Mutex就总会造成死锁或者AbandonedMutexException(我就玩的不怎么好,在并发性访问测试的时候总是遇到关于Mutex的问题,各位线虫见笑了,不过还是把我遇到的一些问题和总结拿出来和大家分享,有误的地方还往指正。
<p>还是先举一个简单的例子,来说明一下这个东西:</p>
<p align="left"> </p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;">
<span style="color: #000000;"> </span>
<span style="color: #0000ff;">public</span>
<span style="color: #000000;"> </span>
<span style="color: #0000ff;">class</span>
<span style="color: #000000;"> ThreadMutex<br><br> {<!-- --></span>
<span style="color: #000000;"><br><br> </span>
<span style="color: #0000ff;">public</span>
<span style="color: #000000;"> </span>
<span style="color: #0000ff;">void</span>
<span style="color: #000000;"> Test()<br><br> {<!-- --><br><br> Thread t1 </span>
<span style="color: #000000;">=</span>
<span style="color: #000000;"> </span>
<span style="color: #0000ff;">new</span>
<span style="color: #000000;"> Thread(Thread1);<br><br> Thread t2 </span>
<span style="color: #000000;">=</span>
<span style="color: #000000;"> </span>
<span style="color: #0000ff;">new</span>
<span style="color: #000000;"> Thread(Thread2);<br><br> t1.Start();<br><br> t2.Start();<br><br> }<br><br> </span>
<span style="color: #0000ff;">public</span>
<span style="color: #000000;"> </span>
<span style="color: #0000ff;">void</span>
<span style="color: #000000;"> Thread1()<br><br> {<!-- --><br><br> Mutex m </span>
<span style="color: #000000;">=</span>
<span style="color: #000000;"> </span>
<span style="color: #0000ff;">new</span>
<span style="color: #000000;"> Mutex(</span>
<span style="color: #0000ff;">false</span>
<span style="color: #000000;">, </span>
<span style="color: #000000;">"</span>
<span style="color: #000000;">test</span>
<span style="color: #000000;">"</span>
<span style="color: #000000;">);<br><br> </span>
<span style="color: #0000ff;">bool</span>
<span style="color: #000000;"> b2 </span>
<span style="color: #000000;">=</span>
<span style="color: #000000;"> m.WaitOne();<br><br> Console.WriteLine(</span>
<span style="color: #000000;">"</span>
<span style="color: #000000;">Thread1 get the mutex : </span>
<span style="color: #000000;">"</span>
<span style="color: #000000;"> </span>
<span style="color: #000000;">+</span>
<span style="color: #000000;"> b2);<br><br> Thread.Sleep(</span>
<span style="color: #000000;">10000</span>
<span style="color: #000000;">);<br><br> m.ReleaseMutex();<br><br> }<br><br> </span>
<span style="color: #0000ff;">public</span>
<span style="color: #000000;"> </span>
<span style="color: #0000ff;">void</span>
<span style="color: #000000;"> Thread2()<br><br> {<!-- --><br><br> Mutex m </span>
<span style="color: #000000;">=</span>
<span style="color: #000000;"> </span>
<span style="color: #0000ff;">new</span>
<span style="color: #000000;"> Mutex(</span>
<span style="color: #0000ff;">false</span>
<span style="color: #000000;">, </span>
<span style="color: #000000;">"</span>
<span style="color: #000000;">test</span>
<span style="color: #000000;">"</span>
<span style="color: #000000;">);<br><br> </span>
<span style="color: #0000ff;">bool</span>
<span style="color: #000000;"> b2 </span>
<span style="color: #000000;">=</span>
<span style="color: #000000;"> m.WaitOne();<br><br> Console.WriteLine(</span>
<span style="color: #000000;">"</span>
<span style="color: #000000;">Thread2 get the mutex : </span>
<span style="color: #000000;">"</span>
<span style="color: #000000;"> </span>
<span style="color: #000000;">+</span>
<span style="color: #000000;"> b2);<br><br> Thread.Sleep(</span>
<span style="color: #000000;">1000</span>
<span style="color: #000000;">);<br><br> m.ReleaseMutex();<br><br> <br><br> }<br><br>}<br><br></span>
</div>
<p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p> <p align="left"> </p>
<p></p>
<p align="left">恩,Thread1中Mutex.WaitOne()后,就想到与Thread1拿到了Mutex所有权,这时Thread2得到了同样的Mutex,然后Mutex.WaitOne(),也想拿到Mutex的所有权,这时就必须等待了。这里只需要两点就能明白什么是 |
|