C#多线程与线程同步机制高级实战课程

okkaandw · · 24 次点击 · 开始浏览    置顶

1.进程和线程是啥?(/s/114xceucTnhkSS5uL8SFgwA 提取码:3q62 ) 进程:进程就是一个应用程序,对电脑的各种资源的占用 线程:线程是程序执行的最小单位,任何操作都是线程完成的,线程依托进程存在的,一个进程可以有多个线程 2.多线程 为啥会出现多此线程? 计算机的角度,因为CPU太快了,其他硬件跟不上CPU的速度。CPU可以分为时间片,大概就是时间分片---上下文切换(加载环境--计算--保存环境)。 从微观角度上说,一个核一个时刻,只能执行一个线程;宏观上来说是多线程并发。 另外CPU多核,可以独立工作。例如计算机是4核8线程中,核指的就是物理的核,线程指的是物理的核。 3.C#语言的线程 就是指Thread(.net 1.0的时候就出现了),Thread是一个类,是C#语言多线程对象的封装。 多线程缺点 线程也是程序,所以线程运行需要占用计算机资源,线程越多占用资源也越多。(占内存多) 多线程需要协调和管理,所以需要CPU跟踪线程,消耗CPU资源。(占cpu多) 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题。多线程存在资源共享问题) 线程太多会导致控制太复杂,最终可能造成很多Bug。(管理麻烦,容易产生bug) 线程安全 如果多个线程访问相同的资源、不管如何调换调用顺序,在主进程不去做任何同步,都会让得到预期结果。这样就是线程安全。多个线程同时访问共享资源时,对共享资源的访问不同会导致数据不一致或产生预期外的结果,这就是非线程安全。 简单来说,线程安全就是你在主方法不管怎么调用某个多线程方法、调用几次、什么顺序调用,都能得到预期结果。 C#中创建和启动线程的方法 在C#中,我们可以使用System.Threading命名空间下的Thread类来实现多线程编程。下面是一个简单的示例,演示了如何创建和启动一个线程: using System; using System.Threading; class Program { static void Main() { // 创建一个Thread对象 Thread myThread = new Thread(new ThreadStart(Work)); // 启动线程 myThread.Start(); // 主线程等待子线程结束 myThread.Join(); Console.WriteLine("线程结束"); } // 在线程中执行的方法 static void Work() { for (int i = 0; i < 5; i++) { Console.WriteLine("子线程正在执行,i = {0}", i); Thread.Sleep(1000); } } } 线程局部存储 我们花费了大量篇幅来讲并发访问公共数据问题,前文提到的锁构造,信号构造,无锁构造本质上都是使用同步构造,使得多线程在访问公共数据时能安全的进行,然而有时我们会希望数据在线程间是隔离的,局部变量就能实现这个目的,但他们的生命周期总是那么短暂(随代码块而释放),我们期待更大作用域的隔离数据,线程局部变量(thread-local storage,TLS)就可以实现这个目的。 注意 1、进程(应用程序)会等待所有的前台线程完成后再结束本工作;但是如果只剩下后台线程,则会直接结束本工作,不会等待后台线程完成后再结束本工作。 2、在任何时候我们都可以通过线程的IsBackground属性改变线程的前后台属性 3、应用程序的主线程以及使用Thread构造的线程都默认为前台线程 4、基于线程池ThreadPool功能创建的线程都默认为后台线程 5、不涉及一些专用的,长时间保持运行的功能,都建议使用后台线程。 6、I/O 异步线程数,这个线程数限制的是执行异步委托的线程数量

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

24 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传