线程、同步与锁——Mutex

论坛 期权论坛     
选择匿名的用户   2021-6-1 16:19   769   0

除了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">&#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>1.   Mutex是一个令牌,当一个线程拿到这个令牌时运行,另外想拿到令牌的线程就必须等待,直到拿到令牌的线程释放令牌。没有所有权的线程是无法释放令牌的。</p>
<p>2.   Mutex(false,”string”)中的string是令牌的关键,或者可以叫令牌名,因为Mutex是跨进程的,整个系统中只会有唯一的令牌存在所以,也就是说你在一个应用程序中的一个线程中得到了Mutex的所有权,那在另外一个线程中的另外的线
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

下载期权论坛手机APP