收藏 分享(赏)

多线程和同步.ppt

上传人:HR专家 文档编号:5995584 上传时间:2019-03-23 格式:PPT 页数:23 大小:255KB
下载 相关 举报
多线程和同步.ppt_第1页
第1页 / 共23页
多线程和同步.ppt_第2页
第2页 / 共23页
多线程和同步.ppt_第3页
第3页 / 共23页
多线程和同步.ppt_第4页
第4页 / 共23页
多线程和同步.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、第五十五讲:多线程和同步,讲师:周红安 E-mail:,如果想在程序执行的过程中去执行其他一些的操作;如果想要同一时刻做几件事情;如果想把同一件事情分开让计算机去做;更甚者,在多核处理器上想要实现丰富的计算功能。那就使用多线程编程来实现吧,多线程编程就是这样的美妙和强大。与此同时,让计算机同时做很多事情,会遇到同步的问题。,在生活中,常常要同时做几件事,例如:学生在上课时,是一边听课,一边记笔记。对于这种情况,就可以把学生上课看作是一个进程,而一边听课,一边记笔记就可以看作是上课的两个线程。同样,在计算机中,计算机的CPU常常需要同时做几件事情,要让计算机处理好这些事情,就可以使用多线程编程。

2、,为了认识线程,得先来认识一个概念进程。在计算机中,每一个程序运行的时候,操作系统都会为它分配一个进程,而线程正是进程的组成单位。线程是程序中独立的指令流,在操作系统中,一个进程至少要包含一个线程。进行多线程编程,就是将要执行的任务分解成多个子任务执行。为了让初学者有更清楚的认识,打开“Windows任务管理器”,这时就会看到应用程序中所含有的线程数,如图1所示。,注意:可能有的读者在自己的电脑上看不到如图1中的线程数。解决办法是这样的:在“Windows任务管理器”中选择菜单栏“查看”“选择列”命令,弹出“选择列”对话框。如图2所示。在“选择列”对话框中选中“线程计数”复选框,然后单击【确定

3、】按钮即可完成。,使用多线程编程的目的之一是为了不让程序产生等待,这是加强用户体验的方法。正确使用多线程编程,能够很好地提高应用程序的性能和运行效率。它的实现原理是将一个进程分成多个线程,然后让它们并发异步执行来提高运行效率。虽然多线程是并发执行的,但是程序的并发执行并不等于是同时执行。任意时刻还是只能有一个线程占有CPU的资源,但是它们会按一定的时间间隔使用CPU的资源,所以在用户看来,感觉到它们似乎都在运行,这是用户在宏观上的感觉。,Thread类,在.NET Framework类库中,多线程的功能被包含在System.Threading命名空间中。因此,要使用多线程,必须先声明引用此命名

4、空间。在这个命名空间中,提供了一些方法,可用于对线程进行的基本操作。例如:启动线程的执行、中止、唤醒等。注意:Thread类的ThreadState属性可以判断线程的当前状态。线程有7个状态,它们是:born(新生)、runnable(可运行)、running(运行)、waiting(等待)、sleeping(睡眠)、blocked(阻塞)、dead(死亡)。,07 static void Main() /入口方法 08 09 Thread t = new Thread(ThreadMain); /创建一个线程 10 t.Start(); /启动它 11 Console.WriteLine(“

5、线程1“); /输出字符串 12 Console.Read(); /获取输入焦点,在DOS窗口中停留 13 14 static void ThreadMain() /线程的主方法,演示线程2 15 16 Console.WriteLine(“线程2“); /输出字符串 17 ,上一例的运行结果,在上一例中,在第09行创建了Thread对象后,Thread类的构造函数接受ThreadMain的委托参数。第10行就可以用Start()方法启动线程了。按正常的程序运行来说,第10行会在第11行前运行,但是从运行结果看来,并不是事先期待的那样,但是,这是不确定的,第10行也可能会在第11行前运行。警告

6、:在上述的示例中,不能保证哪个结果先输出,每次哪个线程在前面都是不确定的。线程由操作系统调度,它们都有不同的优先级,这是由操作系统分配的,所以无法保证哪个结果最先输出。,给线程传递数据,有两种方式可以给线程传递数据。第一种方式是使用带委托参数的Thread类构造函数,就像在示例代码20-1中第9行代码处一样;另一种方式是程序员自己创建一个类,把线程的方法定义为实例方法,这样就可以初始化实例的数据,然后就可以用Start()方法启动线程了。,由于为线程传送的数据是存储在类或者结构中的,所以在传送数据之前,需要定义一个存储数据的类或者结构。在下面的代码中,定义了一个结构体,它包含了一个字符串,这个

7、字符串就可以用来传送任意的数据。01 public struct threadData /创建一个结构体,用于线程间传递信息 02 03 public string Msg; /要传送的数据放在Msg中 04 ,通过定义一个类来传送数据,在类中定义了一个字段,用于保存要传递的数据, 01 public class MyThreadClass /定义一个类,注意,这里不是结构体 02 03 private string Msg; /定义了一个字段Msg 04 public MyThread(string Msg) /带参的构造函数 05 06 this.Msg = Msg; /为字段赋值 07

8、08 public void ThreadMain() /线程的主方法 09 10 Console.WriteLine(“字段Msg的值是:0“, Msg); /输出字段Msg的值 11 12 ,通过以上的方式,创建了一个传递数据的线程MyThreadClass类,然后就可以为MyThreadClass类创建对象,给它的构造函数传送数据,也可以给ThreadMain()方法传递数据。这样线程就可以访问数据了。代码如下所示: 01 MyThreadClass o = new MyThreadClass(“要传送的数据“); /实例化对象,并传送值 02 Thread t = new Thread

9、(o.ThreadMain); /传送线程主方法 03 t.Start(); /启动线程,线程的优先级,操作系统在调度多线程的时候。会给每个线程指定不同的优先级,这样就可以影响调度的顺序,这个过程就像运算符的优先级一样。在Thread类中,通过设置Priority属性来定义基本优先级。,ThreadPriority类枚举线程优先级的所有可能值,在本例中,创建3个线程,为它们定义不同的优先级,它们的运行时间就不一样,,10 MyThreadClass o1 = new MyThreadClass(“我是线程1,我的优先级是:Highest“);/实例化 11 Thread t1 = new Th

10、read(o1.ThreadMain); /传送线程主方法 12 t1.Priority = ThreadPriority.Highest; /指定优先级 13 t1.Start(); /启动线程 14 MyThreadClass o2 = new MyThreadClass(“我是线程2,我的优先级是:Lowest“);/实例化,15 Thread t2 = new Thread(o2.ThreadMain); /传送线程主方法 16 t2.Priority = ThreadPriority.Lowest; /指定优先级 17 t2.Start(); /启动线程 18 MyThreadCla

11、ss o3 = new MyThreadClass(“我是线程3,我的优先级是:BelowNormal“);/实例化 19 Thread t3 = new Thread(o3.ThreadMain); /传送线程主方法 20 t3.Priority = ThreadPriority.BelowNormal; /指定优先级 21 t3.Start(); /启动线程,竞态条件,使用多线程编程会带来一些问题,例如:两个线程竞争资源、单个线程进行死循环等。在术语中,把这两种现象叫做线程的竞态和死锁, 竞态条件就是两个或多个线程访问相同的资源对象,或者相互之间访问不同步的共享状态。竞态条件对很多初学者来

12、说,很难理解。笔者打个简单的比方:假如在一个进程中有两个线程A和B,有一个全局变量i=1。A进程正在计算i=i+1的操作,当刚好取出i的值放到寄存器中时,此时B进程又在进行i=i-1的操作,那么i=i+1永远也计算不出正确的结果。这种现象就是竞态条件。,死锁,在两个线程中,线程A抢到了资源1,还需要资源2;线程B抢到了资源2,还需要资源1。那么必然会产生死锁。在死锁中,至少有两个线程被挂起,等待对方解除锁定。由于两个线程都在等待对方,就出现了死锁,线程将无限等待下去,如图所示 .,由于线程的优先级是动态分配的,所以程序员也无法知道启动的线程是哪一个先执行。如果有某一个线程一直需要使用CPU,而且又不等待资源,那么它的优先级就会降低。如果某一个线程在等待资源,那它的优先级向上就会增加。但是如果为每个线程指定了优先级后,就可以对它进行控制了.,天道酬勤,有耕耘就会有收获,祝读者们学习愉快,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报