线程、同步与锁——Mutex想说爱你不容易

论坛 期权论坛     
选择匿名的用户   2021-6-1 16:19   891   0
<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;">&#61;</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;">&#61;</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;">&#61;</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;">&#34;</span>
  <span style="color: #000000;">test</span>
  <span style="color: #000000;">&#34;</span>
  <span style="color: #000000;">);<br><br>            </span>
  <span style="color: #0000ff;">bool</span>
  <span style="color: #000000;"> b2 </span>
  <span style="color: #000000;">&#61;</span>
  <span style="color: #000000;"> m.WaitOne();<br><br>            Console.WriteLine(</span>
  <span style="color: #000000;">&#34;</span>
  <span style="color: #000000;">Thread1 get the mutex : </span>
  <span style="color: #000000;">&#34;</span>
  <span style="color: #000000;"> </span>
  <span style="color: #000000;">&#43;</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;">&#61;</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;">&#34;</span>
  <span style="color: #000000;">test</span>
  <span style="color: #000000;">&#34;</span>
  <span style="color: #000000;">);<br><br>            </span>
  <span style="color: #0000ff;">bool</span>
  <span style="color: #000000;"> b2 </span>
  <span style="color: #000000;">&#61;</span>
  <span style="color: #000000;"> m.WaitOne();<br><br>            Console.WriteLine(</span>
  <span style="color: #000000;">&#34;</span>
  <span style="color: #000000;">Thread2 get the mutex : </span>
  <span style="color: #000000;">&#34;</span>
  <span style="color: #000000;"> </span>
  <span style="color: #000000;">&#43;</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的所有权,这时就必须等待了。这里只需要两点就能明白什么是
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP