好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

多线程使用lock.doc

6页
  • 卖家[上传人]:ji****n
  • 文档编号:45636893
  • 上传时间:2018-06-18
  • 文档格式:DOC
  • 文档大小:92.50KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 线程同步(线程同步(C#C# 编程指南)编程指南)VisualVisual StudioStudio 20052005 其他版本 Visual Studio 2010 Visual Studio 2008 Visual Studio 2012 24(共 30)对本文的评价是有帮助 - 评价此主题 以下各节描述了在多线程应用程序中可以用来同步资源访问的功能和类在应用程序中使用多个线程的一个好处是每个线程都可以异步执行对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保 持响应对于服务器应用程序,多线程处理提供了用不同线程处理每个传入请 求的能力否则,在完全满足前一个请求之前,将无法处理每个新请求然而,线程的异步特性意味着必须协调对资源(如文件句柄、网络连接和内存) 的访问否则,两个或更多的线程可能在同一时间访问相同的资源,而每个线 程都不知道其他线程的操作结果将产生不可预知的数据损坏 对于整数数据类型的简单操作,可以用 Interlocked 类的成员来实现线程同步 对于其他所有数据类型和非线程安全的资源,只有使用本主题中的结构才能安 全地执行多线程处理。

      有关多线程编程的背景信息,请参见:使用线程处理(C# 编程指南) 托管线程处理基本知识 使用线程和线程处理 托管线程处理的最佳做法 lock 关键字 locklock 关键字可以用来确保代码块完成运行,而不会被其他线程中断这是通过 在代码块运行期间为给定对象获取互斥锁来实现的 locklock 语句以关键字 locklock 开头,它有一个作为参数的对象,在该参数的后面还 有一个一次只能由一个线程执行的代码块例如:C# 复制 public void Function() {System.Object lockThis = new System.Object();lock(lockThis){// Access thread-sensitive resources.} }提供给 locklock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的 范围在上例中,锁的范围限定为此函数,因为函数外不存在任何对该对象的 引用严格地说,提供给 locklock 的对象只是用来唯一地标识由多个线程共享的 资源,所以它可以是任意类实例然而,实际上,此对象通常表示需要进行线 程同步的资源。

      例如,如果一个容器对象将被多个线程使用,则可以将该容器 传递给 lock,而 lock 后面的同步代码块将访问该容器只要其他线程在访问 该容器前先锁定该容器,则对该对象的访问将是安全同步的通常,最好避免锁定 publicpublic 类型或锁定不受应用程序控制的对象实例例如, 如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的 代码也可能会锁定该对象这可能导致死锁,即两个或更多个线程等待释放同 一对象出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题 锁定字符串尤其危险,因为字符串被公共语言运行库 (CLR)“暂留”这意味 着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有 运行的应用程序域的所有线程中的该文本因此,只要在应用程序进程中的任 何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的 所有实例因此,最好锁定不会被暂留的私有或受保护成员某些类提供专门 用于锁定的成员例如,Array 类型提供 SyncRoot许多集合类型也提供 SyncRoot有关 locklock 关键字的更多信息,请参见:lock 语句(C# 参考) 如何:对制造者线程和使用者线程进行同步(C# 编程指南) 监视器 与 locklock 关键字类似,监视器防止多个线程同时执行代码块。

      Enter 方法允许 一个且仅一个线程继续执行后面的语句;其他所有线程都将被阻止,直到执行语句的线程调用 Exit这与使用 locklock 关键字一样事实上,locklock 关键字就 是用 Monitor 类来实现的例如:C# 复制 lock(x) {DoSomething(); }这等效于:C# 复制 System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); try {DoSomething(); } finally {System.Threading.Monitor.Exit(obj); }使用 locklock 关键字通常比直接使用 MonitorMonitor 类更可取,一方面是因为 locklock 更 简洁,另一方面是因为 locklock 确保了即使受保护的代码引发异常,也可以释放 基础监视器这是通过 finallyfinally 关键字来实现的,无论是否引发异常它都执行 关联的代码块有关监视器的更多信息,请参见监视器同步技术示例同步事件和等待句柄 使用锁或监视器对于防止同时执行区分线程的代码块很有用,但是这些构造不 允许一个线程向另一个线程传达事件。

      这需要“同步事件”,它是有两个状态 (终止和非终止)的对象,可以用来激活和挂起线程让线程等待非终止的同 步事件可以将线程挂起,将事件状态更改为终止可以将线程激活如果线程试 图等待已经终止的事件,则线程将继续执行,而不会延迟同步事件有两种:AutoResetEvent 和 ManualResetEvent它们之间唯一的不 同在于,无论何时,只要 AutoResetEventAutoResetEvent 激活线程,它的状态将自动从终止变为非终止相反,ManualResetEventManualResetEvent 允许它的终止状态激活任意多个线程, 只有当它的 Reset 方法被调用时才还原到非终止状态可以通过调用一种等待方法,如 WaitOne、WaitAny 或 WaitAll,让线程等待 事件System.Threading.WaitHandle.WaitOne 使线程一直等待,直到单个事 件变为终止状态;System.Threading.WaitHandle.WaitAny 阻止线程,直到一 个或多个指示的事件变为终止状态;System.Threading.WaitHandle.WaitAll 阻止线程,直到所有指示的事件都变为终止状态。

      当调用事件的 Set 方法时, 事件将变为终止状态在下面的示例中,创建了一个线程,并由 Main 函数启动该线程新线程使用 WaitOneWaitOne 方法等待一个事件在该事件被执行 Main 函数的主线程终止之前, 该线程一直处于挂起状态一旦该事件终止,辅助线程将返回在本示例中, 因为事件只用于一个线程的激活,所以使用 AutoResetEventAutoResetEvent 或 ManualResetEventManualResetEvent 类都可以C# 复制 using System; using System.Threading;class ThreadingExample {static AutoResetEvent autoEvent;static void DoWork(){Console.WriteLine(“ worker thread started, now waiting on event...“);autoEvent.WaitOne();Console.WriteLine(“ worker thread reactivated, now exiting...“);}static void Main(){autoEvent = new AutoResetEvent(false);Console.WriteLine(“main thread starting worker thread...“);Thread t = new Thread(DoWork);t.Start();Console.WriteLine(“main thrad sleeping for 1 second...“);Thread.Sleep(1000);Console.WriteLine(“main thread signaling worker thread...“);autoEvent.Set();} }有关线程同步事件用法的更多示例,请参见:监视器同步技术示例 读取器-编写器同步技术示例 线程池技术示例 等待同步技术示例 Mutex 对象 mutex 与监视器类似;它防止多个线程在某一时间同时执行某个代码块。

      事实 上,名称“mutex”是术语“互相排斥 (mutually exclusive)”的简写形式 然而与监视器不同的是,mutex 可以用来使跨进程的线程同步mutex 由 Mutex 类表示当用于进程间同步时,mutex 称为“命名 mutex”,因为它将用于另一个应用 程序,因此它不能通过全局变量或静态变量共享必须给它指定一个名称,才 能使两个应用程序访问同一个 mutex 对象尽管 mutex 可以用于进程内的线程同步,但是使用 MonitorMonitor 通常更为可取, 因为监视器是专门为 .NET Framework 而设计的,因而它可以更好地利用资源 相比之下,MutexMutex 类是 Win32 构造的包装尽管 mutex 比监视器更为强大, 但是相对于 MonitorMonitor 类,它所需要的互操作转换更消耗计算资源有关 mutex 的用法示例,请参见 Mutex你好最简单的方法就是同步 2 个线程让当前线程等待子线程(t)结束 0.1s 之后,才去执行 Go(False)class Program{static void Main(){var t = new Thread(Go);t.Start(true);Thread.CurrentThread.Join(100);Go(false);Console.ReadLine();}static void Go(object bl){var b = (bool)bl;Console.WriteLine(b ? “HELLO“ : “hello!“);}}。

      点击阅读更多内容
      相关文档
      【物理】跨学科实践:制作简易杆秤 2024-2025学年人教版(2024)八年级物理下册.pptx 数学 平行线的性质说课课件2024-2025学年人教版数学七年级下册.pptx 数学 平行线的判定+说课课件 2024-2025学年人教版数学七年级下册.pptx 数学 第十章 二元一次方程组复习课说课2024-2025学年人教版数学七年级下册.pptx 数学 平移说课课件2024-2025学年人教版数学七年级下册.pptx 语文名著导读《骆驼祥子》习题课件 2024-2025学年统编版语文七年级下册.pptx 语文第21课《望岳》课件-2024-2025学年统编版语文七年级下册.pptx 语文第20课《外国诗二首》课件+2024—2025学年统编版语文七年级下册.pptx 语文第9课《木兰诗》课件-2024-2025学年统编版语文七年级下册.pptx 语文第17课《陋室铭》课件-2024-2025学年统编版语文七年级下册.pptx 语文第24课《带上她的眼睛》课件-2024-2025学年统编版语文七年级下册.pptx 初中英语新外研版八年级上册Unit 1 This is me重点句子(2025秋).doc 初中英语新译林版八年级上册Unit 1 Friendship单词解析(B部分)(2025秋).doc 初中英语新人教版八年级上册Unit 2 Home Sweet Home默写练习(汉译英+英译汉+音标写英汉)(附参考答案)(2025秋).doc 初中英语新译林版八年级上册Unit 1 Friendship单词解析(C部分)(2025秋).doc 初中英语新人教版八年级上册Unit 3 Same or Different重点短语和句型汉译英练习(附参考答案).doc 初中英语新人教版八年级上册Unit 7 When Tomorrow Comes重点短语和句型汉译英练习(附参考答案).doc 语文《六国论》课件2024-2025学年统编版高一语文必修下册.pptx 语文《六国论》课件 2024-2025学年统编版高一语文必修下册.pptx 语文《祝福》课件+2024-2025学年统编版高一语文必修下册.pptx
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.