线程淡写 上海

一,线程的调度
    一旦分配给某个线程的时间片用完了,处理器就要在线程之间切换,在切换过程中,处理器不是任意选择下一个
将执行的线程。每个线程都有一个与之相联系的优先级,这个优先级表示该线程与系统中其他线程的关系,以通知处理器
它应该排在何处。线程的优先级默认为:normal-----该优先级在运行环境中产生。对那些在运行环境之外创建的线程
来说,它们保持各自原来的优先级。可以使用Thread.Priority值,这是个枚举类型,定义为以下几个值:
 最高(Normal),高于正常(AboveNormal),正常(Normal),低于正常(BelowNormal),最低(Lowest)。
  有这样一种情况,几个线程在同样的优先性下运行,它们将获得等量的处理器时间,叫做“循环调度(round robin scheduling)”.

二,线程的安全和同步
      当为单线程环境编程时,以这种方式来书写方法很常见的,即在代码中的几个点处,对象处于暂时的无效状态。
    很明显,如果一次仅有一线程在访问对象,你就要保证在另一个方法被调用以前,每个方法都要完成---这就意味
    着对于对象的任何客户而言,目标总是处于有效状态。但是,当多个线程混合在一起交叉调用时,很容易发生
    这样的情形;当对象处于无效状态时,处理器切换到另一个线程。如果这个线程也试图使用同样的对象,
    其结果是很难以预测的。因此,怎样防止产生这种不可预测的状态呢?同步,通过同步,可以指定代码的临界区(critical section)
    ,一次只有一个线程可以进入临界区。  
       类System.Monitor通过  锁定与信号量的方式,使得对于代码快可以进行串行化的访问。主要有两个静态的
     方法。第一个Montor.Enter。当执行Enter方法时,这个方法试图获取对象上的Monitor锁。如果另一个线程已经
     拥有这个锁,这个方法将会阻塞(block),直至这个锁被释放。注意,这里并不执行隐式的框操作,
     因此你可以只为这个方法提供一个引用类型。方法Monitor.Exit接着被调用,以释放锁。
   用C#中的lock语句中使用Monitor锁
       虽然C#的lock语句并不支持Monitor类中所有的特性,但还是可以让你获得和释放一个Monitor锁。
   通过使用Mutex

原文地址:https://www.cnblogs.com/luozhai714/p/761467.html