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 异步线程数,这个线程数限制的是执行异步委托的线程数量
有疑问加站长微信联系(非本文作者)