天天看点

线程同步(C# 编程指南)

在应用程序中使用多个线程的一个好处是每个线程都可以异步执行。对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应。对于服务器应用程序,多线程处理提供了用不同线程处理每个传入请求的能力。否则,在完全满足前一个请求之前,将无法处理每个新请求。

然而,线程的异步特性意味着必须协调对资源(如文件句柄、网络连接和内存)的访问。否则,两个或更多的线程可能在同一时间访问相同的资源,而每个线程都不知道其他线程的操作。结果将产生不可预知的数据损坏。

有关多线程编程的背景信息,请参见:

<a href="http://msdn.microsoft.com/zh-cn/library/5xt1dysy(v=VS.80).aspx">使用线程处理(C# 编程指南)</a>

<a href="http://msdn.microsoft.com/zh-cn/library/hyz69czz(v=VS.80).aspx">托管线程处理基本知识</a>

<a href="http://msdn.microsoft.com/zh-cn/library/e1dx6b2h(v=VS.80).aspx">使用线程和线程处理</a>

<a href="http://msdn.microsoft.com/zh-cn/library/1c9txz50(v=VS.80).aspx">托管线程处理的最佳做法</a>

lock 关键字

public void Function()

{

    System.Object lockThis = new System.Object();

    lock(lockThis)

    {

        // Access thread-sensitive resources.

    }

}

提供给 <b>lock</b> 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上例中,锁的范围限定为此函数,因为函数外不存在任何对该对象的引用。严格地说,提供给 <b>lock</b> 的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。

监视器

<a></a>

<b>lock</b> 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。

<b>lock</b> 语句以关键字 <b>lock</b> 开头,它有一个作为参数的对象,在该参数的后面还有一个一次只能由一个线程执行的代码块。例如: