mutex用法 多线程中的锁系统(一)

电脑杂谈  发布时间:2017-03-14 16:11:55  来源:网络整理

平常在多线程开发中,总避免不了线程同步。本篇对net多线程中的锁系统做个简单描述。

Lock是Monitor语法糖简化写法,Lock在IL会生成Monitor。

isGetLock参数是Framework 4.0后新加的。 为了使程序在所有情况下都能够确定,是否有必要释放锁。例: Monitor.Enter拿不到锁

Monitor.Enter 是可以锁值类型的。锁时会装箱成新对象,所以无法做到线程同步。mutex用法

一:Lock是只能在进程内锁,不能跨进程,内部走的是混合构造,先自旋再转成内核构造。

二:关于对type类型的锁,如下:

运行结果如下:

在看个例子:

运行结果如下:

第一个例子说明,在同进程同域,不同线程下,锁type int,其实锁的是同一个int对象,所以要慎用。

第二个例子,这里就简单说下。

A: CLR启动时,会创建系统域(System Domain)和共享域(Shared Domain), 默认程序域(Default AppDomain)。 系统域和共享域是单例的。程序域可以有多个,例子中我们使用AppDomain.CreateDomain方法创建的。

B: 按正常来说,每个程序域的代码都是隔离,互不影响的。但对于一些基础类型来说,每个程序域都重新加载一份,就显得有点浪费,带来额外的损耗压力。聪明的CLR会把一些基本类型Object, ValueType, Array, Enum, String, and Delegate等所在的程序集MSCorLib.dll,在CLR启动过程中都会加载到共享域。 每个程序域都会使用共享域的基础类型实例。

C: 而每个程序域都有属于自己的托管堆。托管堆中最重要的是GC heap和Loader heap。GC heap用于引用类型实例的存储,生命周期管理和垃圾回收。Loader heap保存类型系统,如MethodTable,数据结构等,Loader heap生命周期不受GC管理,跟程序域卸载有关。

所以共享域中Loader heapMSCorLib.dll中的int实例会一直保留着,直到进程结束。单个程序域卸载也不受影响。作用域很大有没有!!!

这时第二个例子也很容易理解了。 锁int实例是跨程序域的,MSCorLib中的基础类型都是这样,极容易造成死锁。 而自定义类型则会加载到自己的程序域,不会影响其他。

我们都知道锁的目的,是为了多线程下值被破坏。也知道string在c#是个特殊对象,值是不变的,每次变动都是一个新对象值,这也是推荐stringbuilder原因。如例:

正是由于c#中字符串的这种特性,所以字符串是在多线程下是不会被修改的,只读的。mutex用法它存在于SystemDomain域中managed heap中的一个hash table中。其中Key为string本身,Value为string对象的地址。

当程序域需要一个string的时候,CLR首先在这个Hashtable根据这个string的hash code试着找对应的Item。如果成功找到,则直接把对应的引用返回,否则就在SystemDomain对应的managed heap中创建该 string,并加入到hash table中,并把引用返回。所以说字符串的生命周期是基于整个进程的,也是跨AppDomain。

简单介绍下Wait,Pulse,PulseAll的用法,已加注释。

lock是不能跨进程锁的。 mutex作用和lock类似,但是它能跨进程锁资源(走的是windows内核构造),如例子:

顺序启动A B实例测试下。A首先拿到锁,输出实例1 。B在等待, 如果10秒内A释放,B拿到执行Run()。超时后输出"已经有实例了"。

这里注意的是第一个拿到处理信号 的实例,已经拿到锁了。不需要再WaitOne。 否则报异常。

即信号量,我们可以把它理解为升级版的mutex。mutex对一个资源进行锁,semaphore则是对多个资源进行加锁。

semaphore是由windows内核维持一个int32变量的线程计数器,线程每调用一次、计数器减一、释放后对应加一, 超出的线程则排队等候。

走的是内核构造,所以semaphore也是可以跨进程的。

mutex、Semaphore 需要先把托管代码转成本地用户模式代码、再转换成本地内核代码。

当释放后需要重新转换成托管代码,性能会有一定的损耗,所以尽量在需要跨进程的场景再使用。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-37503-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...