C# 多线程笔记

来源:互联网 发布:百度文库免费下载软件 编辑:程序博客网 时间:2024/05/18 13:47

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);        }    }
测试代码:
        static void Main(string[] args)        {            Count count = new Count();            count.CountTest();            Console.WriteLine("main thread finishes");            Console.ReadLine();        }
解决方法:把有race condition的代码lock住,其他线程要执行这段代码,必须等。这段代码执行完,打开lock。
        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); 当前线程休眠100milliseconds
Name属性,线程名字,调试的时候可以看是哪个线程结束。
Thread.CurrentThread属性:当前线程的引用








0 0
原创粉丝点击