请看演示程序。我们知道List.Find() 如果找到则返回这个对象,找不到返回这个类型的缺省值。下面例子中,你无法这样写: if(res1==null) { }因为结构体的缺少值不是null。演示程序:using System;
using
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。内核模式锁有三种:事件锁AutoResetEvent,MuanualResetEventm,信号量Semaphore,互斥锁Mutex这三种锁,我们发现都有一个WaitOne方法。。。因为他们都是继承于WaitHandle。三种锁都是同根生,其实底层都是通过SafeWaitHandle来对win32api的一个引用。在万不得已的情况下,不要使用内核模式的锁,因为代价太大。其实我们有更多的方式可以替代:混合锁
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。const string mutexName = "勇哥";public static Mutex mutexObj = new Mutex(false, mutexName); 定义了一个全局锁,false表示创建互斥锁之后持有状态是:没有人持有命名“勇哥”,将做为全局的操作系统互斥量,请务必正确关闭互斥量,否则关掉这个进程后再也进不去。这种特性使得互斥量经常被用作“不允许
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。在C#中,赋值和简单的数字运算都不是原子型操作。在多线程环境下,会产生数据安全的问题。Interlocked是“为多个线程共享的变量提供原子操作”,当然这个类是一个静态类。这个类的源代码看不到,因为是调用的CLR内部的方法,不过基本思想应该是通过硬件原语try and set来实现的。该类提供的Add、Increment、Decrement能够完成简单的原子操作。Interlocked类主要方法方法作用Co