一、进程与线程
1)进程被定义为一个正在运行的程序的实例,是系统进行调度和资源分配的一个独立单位。简单分为系统进程和用户进程。而程序是一段静态代码,不能申请系统资源,不能被系统调度,也不能作为单独运行的单位,因此它不占用系统的运行资源。
线程是进程中的一个实体,自己不拥有系统资源,一个标准的线程由线程ID,当前指令指针PC,寄存器集合,堆栈组成。
2)进程由两部分组成:
操作系统用来管理进程的内核对象。内核对象是系统的一种资源,系统对象一旦产生,任何应用程序都可以开启并使用该对象。
操作系统用来管理地址的空间。它包含所有可执行模块或DLL模块的代码和数据。还包含动态内存分配的空间,如线程堆栈。
3)进程和线程的比较:
(1)进程的特点是允许计算机同时运行两个或更多的程序。
(2)在基于线程的多任务处理环境中,线程是最小的处理单位。
(3)多个进程的内部数据和状态都是完全独立的,而多线程共享一块内存空间和一组系统资源,有可能互相影响。
(4)线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程的切换负担要小。
二、Thread类的属性和方法
System.Threading.Thread类是控制线程最常用的类。以下列举常用的属性和方法
属性:
CurrentThread | 只读属性,获取当前正在运行对的线程 |
IsAlive | 判断线程是否处于活动状态 |
IsBackground | 获取或设置一个值,该值指示某个线程是否为后台线程 |
IsThreadPoolThread | 获取一个值,该值指示线程是否属于托管线程池 |
Name | 获取或设置线程的名称 |
Priority | 代表优先级:Normal,AboveNormal,Highest,Lowest |
ThreadState | 代表状态:Unstarted,Running,Aborted,Suspended |
方法:
GetDomain() | 返回当前线程所在的应用程序域 |
Start() | 启动线程的执行 |
Suspend() | 挂起 |
Resume() | 继续已挂起的线程 |
Interrupt() | 终止处于Wait或Sleep或Join状态的线程 |
Join() | 阻塞线程,知道某个线程终止为止 |
Sleep() | 将当前线程阻塞,单位毫秒 |
Abort() | 终止,若已终止,则不能通过Start()来启 |
Wait() | 等待重新执行 |
三、线程操作
(1)创建线程:Thread t1 = new Thread(new ThreadStart(Thread1)); //创建线程
t1.Start( ); //启动线程
t1.Suspend( );
(3)继续线程:if (t1.ThreadState == ThreadState.Suspended) //判断线程是否已被挂起
t1.Resume( );
(4)终止线程:if (t1.IsAlive) //判断线程是否处于活动状态
t1.Abort( );
四、线程同步
线程同步的方法很多,如Volatile,Mutex,Monitor,InterLocked,lock,ReadWriteLock,Semaphore
在多线程中,线程间有时会共享存储空间,当两个或多个线程同时访问同一共享资源时,必然会出现冲突问题。
如一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一个文件中修改数据。在这种情况下,数据可能变一
致。针对这种问题,通常需要让一个线程彻底完成其任务后,再运行下一个线程;或者要求一个线程对共享资源访问完全结束后,
再让另一个线程访问该资源,必须保证一个共享资源一次只能被一个线程使用。实现此目的的过程称为线程同步。