多线程使用lock

多线程使用lock

ID:38068418

大小:92.50 KB

页数:6页

时间:2019-05-25

多线程使用lock_第1页
多线程使用lock_第2页
多线程使用lock_第3页
多线程使用lock_第4页
多线程使用lock_第5页
资源描述:

《多线程使用lock》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、线程同步(C#编程指南)VisualStudio2005其他版本·VisualStudio2010·VisualStudio2008·VisualStudio201224(共30)对本文的评价是有帮助-评价此主题以下各节描述了在多线程应用程序中可以用来同步资源访问的功能和类。在应用程序中使用多个线程的一个好处是每个线程都可以异步执行。对于Windows应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应。对于服务器应用程序,多线程处理提供了用不同线程处理每个传入请求的能力。否则,在完全满足前一个请求之前,将无法处理每个新请求

2、。然而,线程的异步特性意味着必须协调对资源(如文件句柄、网络连接和内存)的访问。否则,两个或更多的线程可能在同一时间访问相同的资源,而每个线程都不知道其他线程的操作。结果将产生不可预知的数据损坏。对于整数数据类型的简单操作,可以用Interlocked类的成员来实现线程同步。对于其他所有数据类型和非线程安全的资源,只有使用本主题中的结构才能安全地执行多线程处理。有关多线程编程的背景信息,请参见:·使用线程处理(C#编程指南)·托管线程处理基本知识·使用线程和线程处理·托管线程处理的最佳做法lock关键字lock关键字可以用来确保代码块完成

3、运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。lock语句以关键字lock开头,它有一个作为参数的对象,在该参数的后面还有一个一次只能由一个线程执行的代码块。例如:C#复制publicvoidFunction(){System.ObjectlockThis=newSystem.Object();lock(lockThis){//Accessthread-sensitiveresources.}}提供给lock关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上例中,锁的范围限定为此函数,因

4、为函数外不存在任何对该对象的引用。严格地说,提供给lock的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给lock,而lock后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。通常,最好避免锁定public类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则lock(this)可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导

5、致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。锁定字符串尤其危险,因为字符串被公共语言运行库(CLR)“暂留”。这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。因此,最好锁定不会被暂留的私有或受保护成员。某些类提供专门用于锁定的成员。例如,Array类型提供SyncRoot。许多集合类型也提供SyncRoot。

6、有关lock关键字的更多信息,请参见:·lock语句(C#参考)·如何:对制造者线程和使用者线程进行同步(C#编程指南)监视器与lock关键字类似,监视器防止多个线程同时执行代码块。Enter方法允许一个且仅一个线程继续执行后面的语句;其他所有线程都将被阻止,直到执行语句的线程调用Exit。这与使用lock关键字一样。事实上,lock关键字就是用Monitor类来实现的。例如:C#复制lock(x){DoSomething();}这等效于:C#复制System.Objectobj=(System.Object)x;System.Threa

7、ding.Monitor.Enter(obj);try{DoSomething();}finally{System.Threading.Monitor.Exit(obj);}使用lock关键字通常比直接使用Monitor类更可取,一方面是因为lock更简洁,另一方面是因为lock确保了即使受保护的代码引发异常,也可以释放基础监视器。这是通过finally关键字来实现的,无论是否引发异常它都执行关联的代码块。有关监视器的更多信息,请参见监视器同步技术示例。同步事件和等待句柄使用锁或监视器对于防止同时执行区分线程的代码块很有用,但是这些构造不

8、允许一个线程向另一个线程传达事件。这需要“同步事件”,它是有两个状态(终止和非终止)的对象,可以用来激活和挂起线程。让线程等待非终止的同步事件可以将线程挂起,将事件状态更改为终止可以将线程激活

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。