概念

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

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

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

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

重点

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

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

3、Mutex是一个内核对象,所以,它是可以用作跨进程线程同步的,进程间互斥。。

A进程可以如此写:

Mutex mutex = new Mutex(true,"mutex1");

B进程则可以如此写:

Mutex mutex = Mutex.OpenExisting("mutex1")
OpenExisting这个方法签名我们后面也可以经常看到,作用就是获取一个已经存在的内核对象。
获取到之后的线程同步代码是跟单进程是一致的。

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*/

用AutoResetEvent实现一个类似于metux的锁。

AutoMutex am=new AutoMutex();
for (int i = 0; i < 10; i++)
{
new Thread(() => {
am.Enter(); Thread.Sleep(1000);
am.Release(); }).Start();
} class AutoMutex
{ static AutoResetEvent are =new AutoResetEvent(true);
static int lockOwner=-1;//当前锁的拥有者
static int recursionCount=-1;//迭代计数器 public void Enter()
{
int currentcount = Environment.CurrentManagedThreadId;
if (lockOwner == currentcount)
{ recursionCount++;
return;
} are.WaitOne();
Console.WriteLine("Current Thread{0}", Environment.CurrentManagedThreadId);
recursionCount = 1;
lockOwner = currentcount;
}
public void Release()
{
if (lockOwner == Environment.CurrentManagedThreadId) return;
if(--recursionCount == 0)
{
are.Set();
lockOwner = -1;
} } public void Dispose()
{ are.Close();
are.Dispose();
} }

C# mutex互斥锁构造的更多相关文章

  1. RWLock——一种细粒度的Mutex互斥锁

    RWMutex -- 细粒度的读写锁 我们之前有讲过 Mutex 互斥锁.这是在任何时刻下只允许一个 goroutine 执行的串行化的锁.而现在这个 RWMutex 就是在 Mutex 的基础上进行 ...

  2. golang mutex互斥锁分析

    互斥锁:没有读锁写锁之分,同一时刻,只能有一个gorutine获取一把锁 数据结构设计: type Mutex struct { state int32 // 将一个32位整数拆分为 当前阻塞的gor ...

  3. Go 标准库 —— sync.Mutex 互斥锁

    Mutex 是一个互斥锁,可以创建为其他结构体的字段:零值为解锁状态.Mutex 类型的锁和线程无关,可以由不同的线程加锁和解锁. 方法 func (*Mutex) Lock func (m *Mut ...

  4. C# Mutex互斥锁

    Mutex 构造函数 (Boolean, String, Boolean) public Mutex ( bool initiallyOwned, string name, out bool crea ...

  5. 【转】【C#】【Thread】Mutex 互斥锁

    Mutex:互斥(体) 又称同步基元. 当创建一个应用程序类时,将同时创建一个系统范围内的命名的Mutex对象.这个互斥元在整个操作系统中都是可见的.当已经存在一个同名的互斥元时,构造函数将会输出一个 ...

  6. 互斥锁Mutex与信号量Semaphore的区别

    转自互斥锁Mutex与信号量Semaphore的区别 多线程编程中,常常会遇到这两个概念:Mutex和Semaphore,两者之间区别如下: 有人做过如下类比: Mutex是一把钥匙,一个人拿了就可进 ...

  7. Golang 读写锁RWMutex 互斥锁Mutex 源码详解

    前言 Golang中有两种类型的锁,Mutex (互斥锁)和RWMutex(读写锁)对于这两种锁的使用这里就不多说了,本文主要侧重于从源码的角度分析这两种锁的具体实现. 引子问题 我一般喜欢带着问题去 ...

  8. 探索互斥锁 Mutex 实现原理

    Mutex 互斥锁 概要描述 mutex 是 go 提供的同步原语.用于多个协程之间的同步协作.在大多数底层框架代码中都会用到这个锁. mutex 总过有三个状态 mutexLocked: 表示占有锁 ...

  9. 【Linux C 多线程编程】互斥锁与条件变量

    一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1) 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态 ...

随机推荐

  1. zookeeper,kafka,redis等分布式框架的主从同步策略

    1 zookeeper选主机制 1.1 LeaderElection选举算法 选举线程由当前Server发起选举的线程担任,他主要的功能对投票结果进行统计,并选出推荐的Server.选举线程首先向所有 ...

  2. vue学习7-v-show和v-if

    1. v-show:这个是一次性会把所有的都渲染出来,然后通过简单的切换display值来修改是否需要被渲染.所以在需要频繁切换的情况下推荐使用.v-show不能在template标签上使用. 2. ...

  3. C++Template(类模板二)

    namespace _myspace{ template<typename T, typename U> class TC { public: TC() { cout << & ...

  4. 流言粉碎机:JAVA使用 try catch 会严重影响性能

    目录 一.JVM 异常处理逻辑 二.关于JVM的编译优化 1. 分层编译 2. 即时编译器 1. 解释模式 2. 编译模式 3. 提前编译器:jaotc 三.关于测试的约束 执行用时统计 编译器优化的 ...

  5. python 列表删除元素,单个元素,多个连续或不连续元素

    以列表a为例 import numpy as np a = ['上海市', '云南省', '内蒙古', '四川省', '天津市', '宁夏', '安徽省', '山东省', '山西省'] 删除单个元素 ...

  6. mvvm与mvc的定义与区别

    mvvm: 即Model-View-ViewModel(模型-视图-视图模型)的简写. 模型(Model):后端传递的数据 视图(View):即前端渲染的页面 视图模型:是 mvvm 的核心,是连接 ...

  7. ApacheCN JavaScript 译文集(二) 20211123 更新

    使用 Meteor 构建单页 Web 应用 零.前言 一.制作 Meteor 应用 二.构建 HTML 模板 三.存储数据和处理集合 四.控制数据流 五.使我们的应用与路由通用 六.保持会话状态 七. ...

  8. springcloud介绍

    1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架 ...

  9. HTML图片轮播

    一.纯 CSS 实现图片轮播 引自原文作者:南张人 原文链接:https://blog.csdn.net/u011848617/article/details/80468463 理论基础 CSS3 a ...

  10. Java高级特性——反射

    感谢原文作者:peter_RD_nj 原文链接:https://www.jianshu.com/p/9be58ee20dee 注意:同一个类在JVM中只存在一份字节码对象 概述 定义 JAVA反射机制 ...