C# mutex互斥锁构造
概念
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互斥锁构造的更多相关文章
- RWLock——一种细粒度的Mutex互斥锁
RWMutex -- 细粒度的读写锁 我们之前有讲过 Mutex 互斥锁.这是在任何时刻下只允许一个 goroutine 执行的串行化的锁.而现在这个 RWMutex 就是在 Mutex 的基础上进行 ...
- golang mutex互斥锁分析
互斥锁:没有读锁写锁之分,同一时刻,只能有一个gorutine获取一把锁 数据结构设计: type Mutex struct { state int32 // 将一个32位整数拆分为 当前阻塞的gor ...
- Go 标准库 —— sync.Mutex 互斥锁
Mutex 是一个互斥锁,可以创建为其他结构体的字段:零值为解锁状态.Mutex 类型的锁和线程无关,可以由不同的线程加锁和解锁. 方法 func (*Mutex) Lock func (m *Mut ...
- C# Mutex互斥锁
Mutex 构造函数 (Boolean, String, Boolean) public Mutex ( bool initiallyOwned, string name, out bool crea ...
- 【转】【C#】【Thread】Mutex 互斥锁
Mutex:互斥(体) 又称同步基元. 当创建一个应用程序类时,将同时创建一个系统范围内的命名的Mutex对象.这个互斥元在整个操作系统中都是可见的.当已经存在一个同名的互斥元时,构造函数将会输出一个 ...
- 互斥锁Mutex与信号量Semaphore的区别
转自互斥锁Mutex与信号量Semaphore的区别 多线程编程中,常常会遇到这两个概念:Mutex和Semaphore,两者之间区别如下: 有人做过如下类比: Mutex是一把钥匙,一个人拿了就可进 ...
- Golang 读写锁RWMutex 互斥锁Mutex 源码详解
前言 Golang中有两种类型的锁,Mutex (互斥锁)和RWMutex(读写锁)对于这两种锁的使用这里就不多说了,本文主要侧重于从源码的角度分析这两种锁的具体实现. 引子问题 我一般喜欢带着问题去 ...
- 探索互斥锁 Mutex 实现原理
Mutex 互斥锁 概要描述 mutex 是 go 提供的同步原语.用于多个协程之间的同步协作.在大多数底层框架代码中都会用到这个锁. mutex 总过有三个状态 mutexLocked: 表示占有锁 ...
- 【Linux C 多线程编程】互斥锁与条件变量
一.互斥锁 互斥量从本质上说就是一把锁, 提供对共享资源的保护访问. 1) 初始化: 在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态 ...
随机推荐
- Sentry 开发者贡献指南 - 浏览器 SDK 集成测试
Sentry 的浏览器 SDK 的集成测试在内部使用 Playwright.这些测试在 Chromium.Firefox 和 Webkit 的最新稳定版本上运行. https://playwright ...
- Qt之进入和出去和关闭事件
widget.h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QEvent> class Wi ...
- java 方法实例
// 方法 public class Demo { public static void main(String[] args) { m(); m2(2); m3('3', 4); m4(4, 6); ...
- (2)puppet单机测试命令apply
单机测试apply命令: 以独立的方式,将清单中的配置应用于本机,也就是说,根据配置清单配置当前服务器. 1.apply这个子命令有很多选项,而我们常用的有debug.verbose.noop等,de ...
- alpakka-kafka(9)-kafka在分布式运算中的应用
kafka具备的分布式.高吞吐.高可用特性,以及所提供的各种消息消费模式可以保证在一个多节点集群环境里消息被消费的安全性:即防止每条消息遗漏处理或重复消费.特别是exactly-once消费策略:可以 ...
- dp学习(六)
高级科技. 26. 虚树 27. 长链剖分优化dp 28. 插头dp
- Java 中对象锁和类锁的区别? 关键字 Synchronized的用法?
一 对象锁和类锁的关系 /* * 对象锁和[类锁] 全局锁的关系? 对象锁是用于对象实例方法,或者一个对象实例上的 this 类锁是用于类的静态方法或者一个类的class对象上的. Ag.class ...
- Codeforces Round #746 Div. 2
掉分快乐qwq C题代码以及分析(在注释里) /* * @Author: Nan97 * @Date: 2021-10-04 22:37:18 * @Last Modified by: Nan97 * ...
- Datawhale 人工智能培养方案
版本号:V0.9 阅读须知 每个专业方向对应一个课程表格 课程表格里的课程排列顺序即为本培养方案推荐的学习顺序 诚挚欢迎为本培养方案贡献课程,有意向的同学请联系Datawhale开源项目管理委员会 本 ...
- CF 1394 简要题解
最近都会做一些 \(\rm Div1\) 套题中 \(3000\) 分以下的题目. A 直接枚举贪心即可. B 首先不难发现总共可能的 \(c\) 序列只有 \(k!\) 种,很明显要暴力枚举所有情况 ...