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

除了Lock()、Monitor之外,我们最长用的就是Mutex了,但是玩不好Mutex就总会造成死锁或者AbandonedMutexException(我就玩的不怎么好,在并发性访问测试的时候总是遇到关于Mutex的问题,各位线虫见笑了,不过还是把我遇到的一些问题和总结拿出来和大家分享,有误的地方还往指正。

还是先举一个简单的例子,来说明一下这个东西:

下面放一个Mutex的简单实现,看看Mutex在.net下是如何实现的。

 

2.Mutex的生命周期,这个问题让我郁闷了很久,因为不太了解Mutex的机制,使得我也没法弄清楚到底能活多长时间,这也是AbandonedMutexException经常会出现的原因。还是先来看一段程序:

在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执行完

            Mutex m 
=   new  Mutex( false " test " );

            
bool  b2 = m.WaitOne();

            Console.WriteLine(b2);

            m.ReleaseMutex();

        }

}

 

结果是:

   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  b2 = m.WaitOne();

            Console.WriteLine(b2);

            m.ReleaseMutex();

            

        }

    }

 

Thread1 get the mutex : True

True

True

Thread2里面的Mutex是新创建的,呵呵,这里面的玄妙自己体会吧。

 

最后要说一下的是Mutex的访问和window访问文件的机制基本上是一样的,window访问对象和访问文件使用的是同样的安全机制(虽然我还没看懂)。

 

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();

            

        }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值