C# mutex互斥锁构造

概念

      Mutext 出现的比monitor更早,而且传承自COM,当然,waitHandle也是它的父类,它继承了其父类的功能,有趣的是Mutex的脾气非常的古怪,它

允许同一个线程多次重复访问共享区,但是对于别的线程那就必须等待,同时,它甚至支持不同进程中的线程同步,这点更能体现他的优势,但是劣势也是显而

易见的,那就是巨大的性能损耗和容易产生死锁的困扰,所以除非需要在特殊场合,否则 我们尽量少用为妙,这里并非是将mutex的缺点说的很严重,而是建议

大家在适当的场合使用更为适合的同步方式,mutex 就好比一个重量型的工具,利用它则必须付出性能的代价。

重点

1、Mutex 相比信号量增加了所有权的概念,一只锁住的 Mutex 只能由给它上锁的线程解开,只有系铃人才能解铃。Mutex 的功能也就因而限制在了构造临界区上。
2、是重入锁,内部有个递归计数器,每次调用都会导致计数器增加1,releaseMutex 导致计数器-1。计数器为0时其他线程才能使用该互斥锁。
mutex 递归问题,导致互斥锁多次进入 内核,所有性能不是很好。可以用autoresetevent 来实现互斥锁的功能。
3、进程间互斥。

什么是可重入锁当一个线程获取锁时,如果没有其它线程拥有这个锁,那么,这个线程就成功获取到这个锁。之后,如果其它线程再请求这个锁,就会处于阻塞等待的状态。但是,如果拥有这把锁的线程再请求这把锁的话,不会阻塞,而是成功返回,所以叫可重入锁。只要你拥有这把锁,你可以可着劲儿地调用,比如通过递归实现一些算法,调用者不会阻塞或者死锁。Mutex 不是可重入的锁。Mutex 的实现中没有记录哪个 goroutine 拥有这把锁。理论上,任何 goroutine 都可以随意地 Unlock 这把锁,所以没办法计算重入条件。

mutex 递归案例

//mutex 递归问题,导致互斥锁多次进入 内核,所有性能不是很好。可以用autoresetevent 来实现互斥锁的功能。
Mutex mutex = new Mutex(false, "first");

Thread threada = new(A);
Thread threadB = new(B);
threada.Start();
threadB.Start();

void A(){
    mutex.WaitOne();
    Console.WriteLine("I am A method");
   
    Console.WriteLine("A call B method");
    B();    
    mutex.ReleaseMutex();   
    }


void B()
{
    mutex.WaitOne();
    Console.WriteLine("I am B method");
    mutex.ReleaseMutex();
}/*
输出:
I am A method
A call B method
I am B method
I am B method*/

 

上一篇:转载:C# 热敏打印机 Socket 网络链接 打印 图片 (二)


下一篇:C#互斥锁初探