概述
定义
进程
进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。
程序是在特定操作系统上的可执行文件,它是一个静态的概念。
而进程可以被认为是程序的一个动态的概念,它有自己的地址空间,能执行一些操作。程序的执行都会伴随着进程的生成,一个程序的执行会产生一个或多个进程。
线程
线程是进程的一个实体,是独立运行和独立调度的基本单位(CPU上真正运行的是线程)。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
在.NET中,一般以Main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。
线程主要是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。
CPU寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路,在线程中主要记录当前所执行线程的状态。
调用栈是用来存储有关正在运行的子程序的返回地址的栈,在此主要用于维护线程所调用到的内存与数据,通过访问调用栈,可以查找到调用的子程序。
TLS分为静态和动态两种,就是基于堆栈的全局变量或者静态变量来访问数据,主要用于将将数据和执行的特定的线程联系起来。
区别
- 进程拥有自己的资源空间,每启动一个进程,系统就会为它分配地址空间;而线程与CPU资源分配无关,多个线程共享同一进程内的资源,使用相同的地址空间。一个进程可以包含若干个线程。同一进程的线程间可以共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(Inter Process Communication,IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
- 多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
- 进程可以通过管道、套接字、信号交互、共享内存、消息队列等等进行通信;而线程本身就会共享内存,指针指向同一个内容,交互很容易。
多线程
创建多线程步骤:
1、编写线程所要执行的方法。
2、实例化Thread类,并传入一个指向线程所要执行方法的委托(ThreadStart或ParameterizedThreadStart)。
Thread thread=new Thread(new ThreadStart(method)),该委托中作为参数的方法不需要参数,并且没有返回值。也可以分开写:
ThreadStart threadStart=new ThreadStart(Calculate);
Thread thread=new Thread(threadStart);
ParameterizedThreadStart可以委托一个方法,利用这个方法可以向线程传递参数,参数类型必须是Object的。
3、调用Thread实例的Start方法。thread.Start();
线程的属性
下面程序里列了一些比较常用的属性。
using System;
using System.Threading;
namespace 多线程
{
class Program
{
static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(Thread1));
//thread1.IsBackground = true;//标记为后台线程
thread1.Start();
//获取当前正在运行的线程
Thread thread=Thread.CurrentThread;
thread.Name = "当前线程";
//获取当前线程的唯一标识符
int id = thread1.ManagedThreadId;
//获取当前线程的状态
ThreadState state = thread1.ThreadState;
//获取当前线程的优先级
ThreadPriority priority = thread1.Priority;
//挂起线程
//thread1.Suspend();
中止线程
//thread1.Abort();
string str = string.Format("Thread ID:{0}n" + "Thread Name:{1}n" + "Thread State:{2}n" + "Thread Priority:{3}n", id, thread.Name,state, priority);
Console.WriteLine(str);
Console.ReadKey();
}
static void Thread1()
{
Console.WriteLine("无参线程!");
}
}
}
同步
线程的同步是指在同一时间只有一个线程可以访问变量,对于多线程程序来讲,需要使用关键字Lock,可以把一段代码定义为互斥段,互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待.
Lock(expression)
{
statement_block
}
如果锁住一个类的实例,可以使用this,在类内的方法里使用lock (this);
如果锁住一个静态变量,一般使用类名.
跨线程访问
需要使用方法回调完成跨线程.
namespace 多线程1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//定义回调
private delegate void setTextValueCallBack();
//声明回调
private setTextValueCallBack a;
private void button1_Click(object sender, EventArgs e)
{
//实例化回调
a = new setTextValueCallBack(SetValue);
//创建一个线程去执行这个方法
Thread thread = new Thread(new ThreadStart(Test));
//将线程设置为后台线程
thread.IsBackground = true;
thread.Start();
}
private void Test()
{
//使用回调,invoke方法可以激活控件所在线程,从而调用控件.invoke(回调,参数(调用方法的参数)).invoke表是同步(会等回调方法执行完后再执行下一步)、begininvoke表示异步(不等直接执行下一步)
textBox1.Invoke(a);
}
/// <summary>
/// 定义回调使用的方法
/// </summary>
private void SetValue()
{
this.textBox1.Text = "1";
}
}
}
线程池
未完待续
下面线程池讲的非常形象.
图解 | 原来这就是线程池
参考链接如下:
C#多线程
最后
以上就是冷艳水蜜桃为你收集整理的C# —— 进程与线程的理解定义区别多线程线程池的全部内容,希望文章能够帮你解决C# —— 进程与线程的理解定义区别多线程线程池所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复