线程和同步
2016-02-06 20:33
246 查看
线程和同步
1 概述
对于所有需要等待 的操作,例 如 ,因 为文件 、 数据库或网络访 问都需要一定 的时间,此 时就可以启 动一个新线程,同时完成其他任务,即使是处理密集型的任务,线程也是有帮助的。2 Parallel类
2.1 用Parallel.For()方法循环
Parallel.For()方法类似于C#的For循环,多次执行一个任务,它可以并行运行迭代。迭代的顺序没有定义。View Code
线程池使用起来很简单,但 它有一些限制 :
线程池 中 的所有线程都是后 台线程 。 如 果进程 的所有前 台线程都结束 了,所 有 的后 台线程就会停止 。 不能把入池的线程改为前台线程 。
不 能给入池的线程设置优先级或名 称 。
入池的线程只能用 于时间较短的任务 。 如 果线程要一直运行(如 Word的 拼写检查器线程),就应使用 Therd类创 建一个线程
6 Therd类
使用Thread类可以创建和控制线程,1 new Thread(() => { Console.WriteLine("Running in thread"); }).Start(); 2 Console.WriteLine("this is the main thread");
6.1给后台线程传递数据
给线程传递一些数据可以采用2中方式,一种是使用带ParameterizdThreadStart委托参数的Thread构造函数,另一种方式是常见一个自定义的类,把线程的方法定义为实例方法。6.2后台任务
只要有一个前台相称在运行,程序的进程就在运行,如果前台多个线程在运行,而Main()方法结束了,应用程序的进程直到所有前台完成其任务前都处于激活状态。默认情况下,用Thread创建的线程为前台线程,线程池中的线程为总是为后台线程。Thread类可以设置IsBackground属性设置是否为前台线程。View Code
6.3线程的优先级
线 程曲操作系统调度。 给线程指定优先级,就 可 以影响调度顺序。在Thread类中,可以设置Priority属性设置线程的优先级,Priority属性需要ThreadPriority枚举定义的一个值,定义级别有Highest,AboveNormal,Normal,BelowNormal和Lowest。6.4控制线程
调用 Thread对 象的Start()方 法,可 以创建线程。 但是,在 调用Strat()方法后,新线程仍不是处于 Running状态,而 是处于 Unstarted状 态。 只要操作系统的线程调度器选择了要运行的线程,线程就会改为Running状态 。 读取Thread.ThreadState属 性,就可以获得线程的当前状态。使用 Thread.Sleep() 方法 ,会使线程处于WaitSleepJoin状态,在 经历Sleep()方法定义的时间段后 ,线程就会等待再次被唤醒。要停止另一个线程,可 以调用Thread.Abort()方 法。 调用这个方法时,会 在接到终止命令的线程中抛出一个ThreadAbortException类 型的异常。 用一个处理程序捕获这个异常,线程可 以在结束前完成一些清理工作。如 果需要等待线程的结束,就 可 以调用Thread.Join()方 法 。此方 法会停止当前线程 ,并把它设置为WaitSleepJoin状 态 ,直 到加入 的线程完成为止 。7线程问题
7.1争用条件
如果两个或多个线程访问相同的对象,或 者访问不同步的共享状态,就会出现争用条件。7.2死锁
过多的锁定也会有麻烦。 在死锁中,至少有两个线程被挂起,并等待对方解除锁定。 由于两个线程都在等待对方,就 出现了死锁,线程将无限等待下去。8 同步
8.1 Lock语句和线程安全
C#为多个线程的同步提供了 自己的关键字:lock语 句 。 lock语 句是设置锁定和解除锁定的一种简单方式。View Code
上面的代码,因为执行了5000次循环,有20个任务,所以输出的值应为100000,但是,事实并非如此。使用Lock修改DoWork方法
View Code
这样结果总是正确的。但是在一个地方使用Lock语句并不意味着,访问对象的其他线程都在等待,必须对每个访问共享状态的线程显示的使用同步功能。继续需改
View Code
8.2 Interlocked类
Ihterlockcd类用 于使变量的简单语旬原子化。 i++不是线程安全的,它 的操作包括从内存中获取一个值,给该值递增 1,再 将它存储回内存。 这些操作都可能会被线程调度器打断。 Ihterlocked类提供了以线程安全的方式递增、 递减、'交换和读取值的方法。 与其他同步技术相 比,使用 Ihterlocked类 会快得多。 但是,它 只能用于简单的同步问题。8.3 Monitor类
C#的lock语 句 ,由编译器解析为使用monitor类,与C#的 lock语 句相 比,Monitor 类的主要优点是:可 以添加一个等待被锁定的超时值 。 这样就不会无限期地等待被锁定.View Code
8.4 Mutex类
Mutex【Mutual exclusion ,互 斥)是.Net Freamwork中 提供跨多个进程同步访问的一个类 由于系统能识别有名称的互斥,因 此可 以使用 它禁止应用程序启动两次1 static class Program 2 { 3 /// <summary> 4 /// 应用程序的主入口点。 5 /// </summary> 6 [STAThread] 7 static void Main() 8 { 9 bool createNew; 10 11 Mutex m = new Mutex(false, "test", out createNew); 12 if (!createNew) 13 { 14 MessageBox.Show("程序已启动"); 15 Application.Exit(); 16 return; 17 } 18 Application.EnableVisualStyles(); 19 Application.SetCompatibleTextRenderingDefault(false); 20 Application.Run(new Form1()); 21 } 22 }
相关文章推荐
- memcached的配置和spymemcached的使用笔记
- c# NG
- 头文件与库文件的区别与联系
- Mysql数据库连接脚本
- Mysql数据库连接脚本
- 解决Windows下python中文乱码问题
- C#高性能TCP服务
- sha1 加密
- 算法学习--二叉树
- LeetCode60. Permutation Sequence
- IntelliJ IDEA创建项目技巧(转)
- 51Nod 1051 最大子矩阵和(二维最大字段和dp)
- U3D物体移动方式小结
- HDU 2894 DeBruijin(欧拉回路)
- android dialog类详解
- python学习之while 和for循环
- Android_Mars学习笔记_S01_001activity初步
- 【3x+1猜想】思考:x一定会缩减成比它小的值
- ios如何在#import方面提升编译性能
- android上的简单hook