第二章、线程和同步(2.1、多线程概述)

2.1、多线程概述

2.1.1、使用多线程的原因

在开发windows应用程序的时候,经常会遇到一些通讯类的需求。比如应用程序中有一个功能是要监听来自别的应用的TCP请求,那么一旦开始监听之后,程序就会处于等待状态,但是用户不希望点击【监听】按钮之后,就一直让整个程序都处于等待状态,而不能在应用程序上面做别的事情,直到接收到来自客户端的一个请求,服务器返回一个响应为止。用户非常希望可以在这个过程中执行其他一些操作,那么这种需求就可以通过多线程来实现:

在该应用程序中,当主线程启动之后,用户来点击【监听】按钮,可以对这个监听程序启动一个新的线程,运行在该应用程序中,来等待客户的请求,这个线程可以称为监听器线程。只要接收到请求,就把它传送给另一个工作线程,由这个工作线程继续与客户通信。监听器线程会立即返回,监听下一个客户发送的下一个请求。

使用线程有几个原因:第一个原因是不让用户等待,对于所有需要等待的操作,例如文件、数据库或网络访问的启动都需要一定的时间,此时就可以启动一个新线程,完成其他任务,让用户感觉到多个功能可以并行运行。第二个原因是提高效率:一个进程的多个线程可以同时运行在不同的CPU上,或多个核心CPU的不同核心上。

2.1.2、多线程的实例

线程是程序中独立的指令流。使用C#编写任何程序时,都有一个入口:Main()方法。程序从Main()方法的第一条语句开始执行,直到这个方法返回为止。这个程序结构非常适合于有一个可识别的任务序列的程序,但程序常常需要同时完成多个任务,这个就需要使用多线程。线程对客户端和服务器端应用程序都非常重要。

在Visual Studio编辑器中输入C#代码时,Dynamic Help窗口会立即显示与所输入代码相关的主题,这个就是后台线程搜索的关联项。

Microsoft Word的拼写检查器也会做相同的事。一个线程等待用户输入,另一个线程进行后台搜索,第三个线程将写入的数据存储在临时文件中,第四个线程从Internet上下载其他数据。

使用【Windows任务管理器】,首先选择【进程】,然后可以从菜单【查看】->【选择列】中选择【PID(进程标示符)】、【线程数】,查看进程和每个进程对应的线程数:

 

2.1.3、线程状态转换

每一个应用程序都是一个进程,进程是由线程构成的,每个线程又是由多条指令构成的,每个进程都至少有一个线程,这个线程是启动线程,又被称为主线程,其他的线程都是并发执行的子线程。下面以一个进程的多个线程在一个CPU的某一个核上面,从开始执行到终止执行的状态转换:

 

 

 

通过上面的线程的状态转换,可以很清楚的看出多线程的本质:在一个CPU的某一个核上面,实际上在每一个时间片上面,只会有一个线程运行,其他线程都处于等待状态,但是由于时间片很短,每个线程运行一个时间片之后,就停止等待,让别的线程也运行一个时间片,各个线程依次循环运行和等待,所以从宏观上看,一个进程的多个线程是在并发的执行,这个也就让用户感觉到多个线程可以并发的执行。

对于一台电脑上面有多个CPU或者多核CPU,那么机器上运行的多个线程可以分配到不同的CPU或者核上面,这种方式是从硬件上提高机器的性能,增加程序运行的效率。但是对于单个核,仍然是满足上面的规则的,还是一个时间片只运行一个线程。      

 

2.1.4、多线程存在的问题

操作系统会调度线程。线程有一个优先级、正在处理的程序的位置计数器、一个存储其本地变量的堆栈。每个线程都有自己的堆栈,但程序代码的内存和堆由一个进程的所有线程共享。这使一个进程中的所有线程之间的通信非常快――该进程的所有线程都寻址相同的虚拟内存。但是,这也使处理比较困难,因为多个线程可以修改同一个内存位置。

通俗的说,一个进程的多个线程在并发执行的时候,它们可以访问相同的数据,这个就很容易出问题。所以必须实现同步机制,多线程在后面的章节中会详细的讲解。

2.1.5、C#创建线程的方式

在Visul C#中,可以通过异步委托来创建线程;另外,System.Threading 命名空间提供一些使得可以进行多线程编程的类和接口,在该命名空间下线程的创建有以下三种方法:Thread、ThreadPool、Timer。在本章中,主要是围绕这几种方式来讲解多线程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值