除了Lock()、Monitor之外,我们最长用的就是Mutex了,但是玩不好Mutex就总会造成死锁或者
AbandonedMutexException
(我就玩的不怎么好,在并发性访问测试的时候总是遇到关于Mutex的问题,各位线虫见笑了,不过还是把我遇到的一些问题和总结拿出来和大家分享,有误的地方还往指正。
<p>还是先举一个简单的例子,来说明一下这个东西:</p>
<p align="left">恩,Thread1中Mutex.WaitOne()后,就想到与Thread1拿到了Mutex所有权,这时Thread2得到了同样的Mutex,然后Mutex.WaitOne(),也想拿到Mutex的所有权,这时就必须等待了。这里只需要两点就能明白什么是Mutex了:</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
<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>1. Mutex是一个令牌,当一个线程拿到这个令牌时运行,另外想拿到令牌的线程就必须等待,直到拿到令牌的线程释放令牌。没有所有权的线程是无法释放令牌的。</p>
<p>2. Mutex(false,”string”)中的string是令牌的关键,或者可以叫令牌名,因为Mutex是跨进程的,整个系统中只会有唯一的令牌存在所以,也就是说你在一个应用程序中的一个线程中得到了Mutex的所有权,那在另外一个线程中的另外的线 |
|