C# 多线程
进程
资源分配的单位。资源:内存,代码,图片,音频。。。
一般情况下,一个进程内,只有一个线程(主线程,是一个前台线程)。
在资源管理器中看到的都是进程,进程包含着一个程序运行所需要的所有资源。
进程之间是独立的,一个进程无法直接访问另一个进程的数据。每个进程都有自己的代码段,数据段,程序控制块PCB
一个进程的运行失败,不会影响其他进程的运行。
一个进程至少有一个线程,主线程。一个进程中的线程可以“并发”执行。
应用程序域
他提供安全而通用的处理单元,CLR可以使用它来提供应用程序之间的隔离。可以在一个进程中运行具有同等隔离级别的多个应用程序域,而不会造成进程间切换的开销。在一个进程内运行多个应用程序可以显著增强了server的可伸缩性。
优势:在一个应用程序出错误不会影响其他的应用程序。能够在不停止整个进程的情况下停止单个应用程序。应用程序域形成了托管代码的隔离,卸载和安全边界。在任意给定,每个线程都在一个应用程序域中执行。线程
线程是cpu调度的最小单位。
线程是执行代码的,是一个执行流。
每个线程都有自己的专有寄存器(栈指针,pc等),但是代码区是共享的,不同的线程可以执行同样的代码。
线程间切换,要保存线程的执行现场(方法名,pc指针,局部变量等)到线程栈中,用于后来的恢复。这个消耗可以忽略不计。线程有关的类,在System.Threading namespace下面的
线程是要执行一段代码的,要准备一个方法,里面放线程要执行的代码。这个方法执行完了,线程就结束了。static void ThreadTest1() { Thread t1 = new Thread(ThreadMethod1); t1.Start(); } static void ThreadMethod1() { int sum = 0; for (int i = 0; i < 99999999; i++) { sum += i; } Console.WriteLine(sum); }
线程default都是前台线程。要所有的前台线程退出以后,程序退出。
一个程序,要等所有的前台线程结束以后,程序才退出。
后台线程,所有的前台线程结束以后,后台线程就立即结束,不管他的代码有没有执行完毕。
thread.IsBackground = true;
race condition例子:多个线程同时操作一个数据!!!
测试代码:class Count { private static int num = 0; public void CountTest() { Thread t1 = new Thread(Increment); Thread t2 = new Thread(Increment); t1.Start(); t2.Start(); } private void Increment() { for (int i = 0; i < 100000000; i++) { num++; } Console.WriteLine(num); } }
解决方法:把有race condition的代码lock住,其他线程要执行这段代码,必须等。这段代码执行完,打开lock。static void Main(string[] args) { Count count = new Count(); count.CountTest(); Console.WriteLine("main thread finishes"); Console.ReadLine(); }
private void Increment() { <span style="background-color: rgb(255, 255, 153);">lock (this)</span> { for (int i = 0; i < 100000000; i++) { num++; } } Console.WriteLine(num); }
线程类常用的方法和属性
Abort(), 强行结束线程Start(), 开启线程Thread.Sleep(100); 当前线程休眠100millisecondsName属性,线程名字,调试的时候可以看是哪个线程结束。Thread.CurrentThread属性:当前线程的引用