c#中的多线程-入门

c#中的多线程-入门

ID:12037625

大小:52.00 KB

页数:12页

时间:2018-07-15

c#中的多线程-入门_第1页
c#中的多线程-入门_第2页
c#中的多线程-入门_第3页
c#中的多线程-入门_第4页
c#中的多线程-入门_第5页
资源描述:

《c#中的多线程-入门》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、概述与概念C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行。一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多线程创建额外的线程。这里的一个简单的例子及其输出:除非被指定,否则所有的例子都假定以下命名空间被引用了:usingSystem;usingSystem.Threading;classThreadTest{staticvoidMain(){Threadt=newThread(WriteY);t.Start();//在新的线程中运行WriteYwhile(true

2、)Console.Write("x");//不停地写'x'}staticvoidWriteY(){while(true)Console.Write("y");//不停地写'y'}}xxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyy

3、yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...主线程创建了一个新线程“t”,它运行了一个重复打印字母"y"的方法,同时主线程重复但因字母“x”。CLR分配每个线程到它自己的内存堆栈上,来保证局部变量的分离运行。在接下来的方法中我们定义了一个局部变量,然后在主线程和新创建的线程上同时地调用这个方法。staticvoidMain(){newThread(Go).Start();//调用Go()方法在一个新线程中Go();//在主线程中调用Go()}sta

4、ticvoidGo(){//声明和使用一个局部变量'cycles'for(intcycles=0;cycles<5;cycles++)Console.Write('?');}??????????变量cycles的副本分别在各自的内存堆栈中创建,输出也一样,可预见,会有10个问号输出。当线程们引用了一些公用的目标实例的时候,他们会共享数据。下面是实例:classThreadTest{booldone;staticvoidMain(){ThreadTesttt=newThreadTest();//创建一个实例newThread(tt.Go).Start();t

5、t.Go();}//注意Go现在是一个实例方法voidGo(){if(!done){done=true;Console.WriteLine("Done");}}}因为在相同的ThreadTest实例中,两个线程都调用了Go(),它们共享了done字段,这个结果输出的是一个"Done",而不是两个。Done静态字段提供了另一种在线程间共享数据的方式,下面是一个以done为静态字段的例子:classThreadTest{staticbooldone;//静态方法被所有线程一块使用staticvoidMain(){newThread(Go).Start();Go

6、();}staticvoidGo(){if(!done){done=true;Console.WriteLine("Done");}}}上述两个例子足以说明,另一个关键概念,那就是线程安全(或反之,它的不足之处!)输出实际上是不确定的:它可能(虽然不大可能),"Done",可以被打印两次。然而,如果我们在Go方法里调换指令的顺序,"Done"被打印两次的机会会大幅地上升:staticvoidGo(){if(!done){Console.WriteLine("Done");done=true;}}DoneDone  (usually!)问题就是一个线程在判断

7、if块的时候,正好另一个线程正在执行WriteLine语句——在它将done设置为true之前。补救措施是当读写公共字段的时候,提供一个排他锁;C#提供了lock语句来达到这个目的:classThreadSafe{staticbooldone;staticobjectlocker=newobject();staticvoidMain(){newThread(Go).Start();Go();}staticvoidGo(){lock(locker){if(!done){Console.WriteLine("Done");done=true;}}}}当两个线程

8、争夺一个锁的时候(在这个例子里是locker),一个线程等待,或者

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

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

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