C# via CLR 多线程的学习

本文介绍了C#中的多线程概念,包括程序、进程和线程的关系,线程的基本信息,如线程结构、上下文切换,以及如何使用Thread类。还探讨了多线程的适用场景,避免使用多线程的情况,死锁问题及其解决策略,并讨论了多种线程同步方法,如volatile关键字、lock、Interlocked和Monitor。
摘要由CSDN通过智能技术生成

程序、进程和线程关系

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

  1. 什么是程序(program)?
    程序是存储在磁盘上的一段可执行代码,它是一种静态的描述。可以理解为程序是死的。

  2. 什么是进程(process) ?
    进程是将磁盘上存储的可执行代码,加载到内存执行的一个动态过程。可以理解为进程是活的。进程是应用程序的一个实例要使用的资源的集合。进程是系统分配资源基本单位,每个进程都有自己的地址空间,进程与进程之间的运行互不影响。

  3. 什么线程(thread)?
    线程可以理解一个逻辑CPU ,线程是在进程中创建的,系统不会为线程单独创建地址空间,同一个进程中的线程共享一块地址空间。
    线程是进程的一个实体,是CPU调度和分派的基本单位,线程的划分尺度小,使得多线程程序的并发性高。

进程和线程的主要区别:进程有独立的地址空间,一个进程崩溃后,不会对其它进程产生影响。而线程只是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮。但在进程切换时,耗费资源较大,效率要低,不能满足高并发需求。而且对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

线程基本信息

线程结构:

  1. 线程内核对象:线程的最基本信息,包含线程属性信息、线程上下文等。
  2. 线程环境块:线程的try catch块信息。
  3. 用户模式栈:用于存储线程用到的局部变量和实参。
  4. 内核模式栈:处理多线程并发时,.NET需要将用户模式栈的数据全部存储到内核模式栈中,保证window内核可以直接读取.NET线程的数据。

多线程上下文的切换

过程:
1、将正在执行的线程的相关实参等数据压入该线程的上下文中
2、选取即将执行的线程
3、将即将执行线程的上下文的数据弹出,并存入至CPU的寄存器中

线程的 3 个基本状态:就绪,执行,阻塞

线程的上下文切换时采用时间片轮转的方式进行的。当一个正在执行的线程时间片用完而未完成任务,且线程等待队列不为空,则执行线程的切换;若线程用完时间片,且将要执行的还是当前线程,则系统不会进行上下文的切换;若线程未用完时间片就完成了任务,那么CPU会提前进行上下文的切换。

Thread类

Thread

构造函数
Thread的构造函数
常用字段
Thread字段

常用的方法
Start() : 启动线程
Join() :等待线程完成
Abort() : 终止线程
Sleep() : 睡眠
Finalize() : 释放线程占用的资源

线程可以通过它的Name属性进行命名,

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值