C#多线程编程

C#多线程编程

  1. 一个程序至少有一个进程,一个进程至少有一个线程.
  2. 线程的划分尺度小于进程,使得多线程程序的并发性高。
  3. 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
  4. 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  5. 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

CLR:和Java虚拟机一样也是一个运行时环境,在运行时有一些功能(内存管理、安全性、异常处理、线程)是由CLR完成的。CLR不是单独为某一种语言存在的,而是面向CLR所有语言的使用,只要编译器是面向CLR的都可以。当你在面向CLR的编译器中运行C#应用时,会发生如下步骤:1.C#源代码文件 2.C#编译器 3.托管模块(中间语言(IL)和元数据)。记得IL是和元数据在一起的。IL:(中间语言):从字眼上可以知道,中间语言就是基于源代码和目标语言之间对吧,因为C#的源代码不能直接给机器识别的,这时候就出现来IL,那么先把C#源代码编译成IL,再由IL编译可执行的代码。(C#的两次编译原理)元数据:元数据主要有两种表示:一种描述源代码中定义的类型和成员,另一种描述源代码引用类型和成员,简单来说就是一个数据表的集合。当我们在写C#代码的时候,需要引用一些引用类型、成员等数据,这些是从哪里来的呢?是编译器直接从托管模块读取元数据的。也就是说: 读取时:元数据->面向CLR的编译器(元数据的数据代码编译成编译器可识别的语法进行编程 如:C# VB等) 运行时:1.源代码文件 2.编译器 3.托管模块(中间语言(IL)和元数据)

.Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。
.Net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序。

用来存放应用程序使用的线程的集合,可以理解为存放线程的地方,这种集中存放的方式有利于管理线程。当应用程序想要执行一个异步操作时,需要调用QueueUserWorkItem方法将对应的任务添加到线程池中。线程池会从队列中提取任务,并且将其委派给线程池中的线程执行。

线程同步技术是指多线程程序中,为了保证后者线程,只有等待前者线程完成之后才能继续执行。就好比买票,前面的人没买到票之前,后面的人必须等待。对线程技术存在的隐患:当我们去访问一个共享资源的时候,有可能会同时去访问一个共享资源,这会破坏资源中的数据。类似于操作系统中的同步互斥问题,因此一般很少使用线程同步。
使用监视器对象实现线程同步
监视器对象能够确保线程拥有对共享资源的互斥访问权,C#通过lock关键字提供简化的语法。

ps:参考于百科与知乎。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值