ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:36.81KB ,
资源ID:7963185      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7963185.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(c程序设计教程课件完整版.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

c程序设计教程课件完整版.docx

1、c程序设计教程课件完整版 集团标准化办公室:VV986T-J682P28-JP266L8-68PNNc程序设计教程课件 本文由x4168138贡献 ppt文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 第9章 多线程 本章内容 9.1 一个简单的多线程应用程序 9.2 线程及其实现方法 9.3 线程的同步控制 9.4 线程池 9.5 线程对控件的访问 9.1 一个简单的多线程应用程序 C#程序设计教程蒙祖强编着 本小节创建的多线程应用程序一共包含两个线程, 本小节创建的多线程应用程序一共包含两个线程,这两个线程并 发地在屏幕上输出相关的字符串。 发地在屏幕上输出

2、相关的字符串。 程序的关键代码如下: 程序的关键代码如下: class A public static int n = 0; public void f() for (int i = 0; i 10; i ) Console.WriteLine(f()在输出:0, A.n); 在输出: 在输出 A.n ; 让当前线程 Thread.Sleep(100); 睡眠100毫秒 睡眠 毫秒 9.1 一个简单的多线程应用程序 C#程序设计教程蒙祖强编着 class B public static void g() for (int i = 0; i account1) Console.WriteLine

3、(转帐金额超出了帐户 转帐金额超出了帐户account1所剩的金额, 所剩的金额, 转帐金额超出了帐户 所剩的金额 转帐失败!); 转帐失败! 转帐失败 return; 9.3 线程的同步控制 9.3.1 为什么要同步控制 C#程序设计教程蒙祖强编着 account1 = account1 - sum; account2 = account2 sum; Console.WriteLine(转帐 后 帐户 还剩余的金额: 转帐 帐户account1还剩余的金额: 还剩余的金额 account1.ToString(); public void fetching() /取款 取款 Thread.Sl

4、eep(100); account1 = account1 - 2000; /取款 取款2000元 取款 元 static void Main(string args) Bank a = new Bank(); Thread user1 = new Thread(new ThreadStart(a.transfering); Thread user2 = new Thread(new ThreadStart(a.fetching); user1.Start(); user2.Start(); Console.ReadKey(); 9.3 线程的同步控制 9.3.1 为什么要同步控制 C#程序设

5、计教程蒙祖强编着 程序中的类Bank定义了两个方法: fetching()和transfering(),它 程序中的类 定义了两个方法: 和 , 定义了两个方法 们分别用于实现取款和转帐操作, 们分别用于实现取款和转帐操作,并基于这两个方法分别创建了 线程user1和user2。程序运行时,user1和user2几乎是同时开始工 线程 和 。程序运行时, 和 几乎是同时开始工 随后user1 从键盘接收转帐金额 , 然后完成转帐操作 ; 但 作 , 随后 user2的 “ 动作 ” 比较快 , 立刻就取出 的 动作” 比较快, 立刻就取出2000元 。 程序运行结果如 元 下图所示。 下图所示

6、。 可以看到, 查询帐户account1时,明明显示了还剩 元的信息, 可以看到,user1查询帐户 查询帐户 时 明明显示了还剩2500元的信息, 元的信息 但在执行从account1向account2转2000元时,却出现了操作失败的提示 元时, 但在执行从 向 转 元时 即使转帐操作成功了,结果显示的剩余金额也不对)。其原因在于, )。其原因在于 (即使转帐操作成功了,结果显示的剩余金额也不对)。其原因在于, 恰好在user1等待接收从键盘输入的转帐金额时,user2从帐户 等待接收从键盘输入的转帐金额时, 从帐户account1上 恰好在 等待接收从键盘输入的转帐金额时 从帐户 上 提

7、走了2000元。显然,我们不希望发生这种情况,这就需要线程的同步 提走了 元 显然,我们不希望发生这种情况, 控制来解决。 控制来解决。 9.3 线程的同步控制 9.3.2 使用 使用ManualResetEvent类 类 C#程序设计教程蒙祖强编着 ManualResetEvent类的作用是:通知一个或多个正在等待的线程已 类的作用是: 类的作用是 发生事件。 发生事件。 ManualResetEvent类对象有两种状态:有信号状态和无信号状态。 类对象有两种状态:有信号状态和无信号状态。 类对象有两种状态 其状态常通过两种方法设置:一种是使用构造函数, 其状态常通过两种方法设置:一种是使用

8、构造函数,另一种是对象 方法。例如: 方法。例如: 使用构造函数 ManualResetEvent mre = new ManualResetEvent(false); ManualResetEvent mre = new ManualResetEvent(true); /初始化 初始化mre为无信号状态 初始化 为无信号状态 /初始化 初始化mre为有信号状态 初始化 为有信号状态 mre.Reset(); mre.Set(); /使mre处于无信号状态 使 处于无信号状态 /使mre处于有信号状态 使 处于有信号状态 使用对象方法 9.3 线程的同步控制 9.3.2 使用 使用Manual

9、ResetEvent类 类 C#程序设计教程蒙祖强编着 当ManualResetEvent类对象处于无信号状态时,调用该对象 类对象处于无信号状态时, 类对象处于无信号状态时 WaitOne()方法的线程将被阻止运行(暂停); 方法的线程将被阻止运行 方法的线程将被阻止运行(暂停); 当该对象变为处于有信号状态( 方法收到信号) 当该对象变为处于有信号状态(WaitOne()方法收到信号)时, 方法收到信号 WaitOne()方法将解除该线程的暂停状态,使它继续运行。 方法将解除该线程的暂停状态, 方法将解除该线程的暂停状态 使它继续运行。 据此,我们就可以实现多线程的同步控制。方法是:将被视

10、为 据此,我们就可以实现多线程的同步控制。方法是: 一体的语句序列置于Reset()和Set()方法之间(称为“加锁”), 方法之间( 一体的语句序列置于 和 方法之间 称为“加锁” 与它们并发的线程,在读取共享变量前先调用WaitOne()方法; 方法; 与它们并发的线程,在读取共享变量前先调用 方法 这样在执行这些语句序列时由于ManualResetEvent类对象无信 这样在执行这些语句序列时由于 类对象无信 因此该线程被暂停,直到它们执行完了以后才有信号, 号,因此该线程被暂停,直到它们执行完了以后才有信号,该 线程才能继续执行,因而避免读取不正确的数据, 线程才能继续执行,因而避免读

11、取不正确的数据,从而实现线 程的同步控制。 程的同步控制。 9.3 线程的同步控制 9.3.2 使用 使用ManualResetEvent类 类 C#程序设计教程蒙祖强编着 下面分两种情况来介绍如何对多线程进行同步控制。 下面分两种情况来介绍如何对多线程进行同步控制。 1. 单线程的加锁 对于上节介绍的程序BankTransfering,为解决其同步问题,可将 对于上节介绍的程序 ,为解决其同步问题, 代码修改如下(红色部分): 代码修改如下(红色部分): class Bank private double account1 = 2500; private double account2 = 1000; /创建 /创建ManualResetEvent类的对象mre 创建ManualResetEvent类的对象 类的对象mre p

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1