定义

进程

进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。
程序是在特定操作系统上的可执行文件,它是一个静态的概念。
而进程可以被认为是程序的一个动态的概念,它有自己的地址空间,能执行一些操作。程序的执行都会伴随着进程的生成,一个程序的执行会产生一个或多个进程。

线程

线程是进程的一个实体,是独立运行和独立调度的基本单位(CPU上真正运行的是线程)。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
在.NET中,一般以Main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。
线程主要是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。
CPU寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路,在线程中主要记录当前所执行线程的状态。
调用栈是用来存储有关正在运行的子程序的返回地址的栈,在此主要用于维护线程所调用到的内存与数据,通过访问调用栈,可以查找到调用的子程序。
TLS分为静态和动态两种,就是基于堆栈的全局变量或者静态变量来访问数据,主要用于将将数据和执行的特定的线程联系起来。

区别

  1. 进程拥有自己的资源空间,每启动一个进程,系统就会为它分配地址空间;而线程与CPU资源分配无关,多个线程共享同一进程内的资源,使用相同的地址空间。一个进程可以包含若干个线程。同一进程的线程间可以共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(Inter Process Communication,IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
  2. 多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
  3. 进程可以通过管道、套接字、信号交互、共享内存、消息队列等等进行通信;而线程本身就会共享内存,指针指向同一个内容,交互很容易。

多线程

创建多线程步骤:

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# —— 进程与线程的理解相关推荐

  1. Java中关于进程和线程的理解

    进程:进程是操作系统的基础结构,是一次程序的执行,是一个程序及其数据在处理机上顺序执行所发生的的活动,是程序在数据集合上运行的过程,它是操作系统进行资源调度和分配的一个  独            立 ...

  2. python的进程和线程定位_Python | 进程 线程的理解拾遗

    进程和线程的理解 线程是操作系统能够进行预算调度的最小单位,它包含在进程中是进程中的实际运作单位. Linux 进程有父进程和子进程,window 系统的进程是平等关系 一个标准的线程有线程 ID , ...

  3. Java 多线程详解(二)------如何创建进程和线程

    Java 多线程详解(一)------概念的引入:https://blog.csdn.net/weixin_39816740/article/details/80089790 在上一篇博客中,我们已经 ...

  4. Java--多线程之并发,并行,进程,线程(一)

    Java--多线程之并发,并行,进程,线程(一)_MinggeQingchun的博客-CSDN博客 Java--多线程之终止/中断线程(二)_MinggeQingchun的博客-CSDN博客_java ...

  5. iOS开发 - 线程与进程的认识与理解

    进程: 进程是指在系统中正在运行的一个应用程序,比如同时打开微信和Xcode,系统会分别启动2个进程; 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内; 线程: 一个进程要想执行任务 ...

  6. 形象理解操作系统的进程与线程

    在网上看到一个特别形象的举例,让我们理解操作系统中的进程与线程,以及线程同步方式中的"互斥锁"(Mutual exclusion,缩写 Mutex)."信号量" ...

  7. 多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别

    当面临这些问题的时候,有两个关键词无法绕开,那就是并行和并发. 首先,要先了解几个概念: 1.进程是程序的一次执行. 2.进程是资源分配的基本单位. 3.一个进程可以包括多个线程. 4.在单CPU计算 ...

  8. python是如何实现进程池和线程池的_进程、线程、线程池和协程如何理解?

    1.进程.线程.线程池的概念 进程是一个动态的过程,是一个活动的实体.简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者.可以说,进程中包含了多个可以同时运行的线程 ...

  9. c++ createtoolhelp32snapshot取进程路径_理解进程和线程

    进程和线程是操作系统里很重要的概念,但是所有的东西都会落实到代码.看起来很复杂的进程线程,其实在操作系统的代码里.也只是一些数据结构和算法.只不过他比一般的数据结构和算法可能复杂点.但是学习方法还是一 ...

最新文章

  1. Android actionBar与Fragment结合使用Demo2
  2. 语音信号的分帧加窗的matlab实现
  3. 微软2019暑期实习笔试题
  4. C++读取txt中数据的两种方法
  5. 【解放日报】除了CEO首席执行官,你了解CIO吗?
  6. Mysql数据库设计规范之二数据库字段设计规范
  7. 陕师大计算机科学学院研究生,陕师大研究生
  8. php 便利字符串,Go语言遍历字符串——获取每一个字符串元素
  9. typedef 定义结构体说明
  10. C# WPF MVVM 实战 – 2.4 单元测试
  11. 【上海房价预测】代码实现——利用BP神经网络进行上海二手房价预测
  12. 数据库存储过程怎么写
  13. Unity一个默认占用C盘空间的小坑
  14. Python新手的数据批量处理教程(TXT文件)
  15. 计算机相关商标,计算机的商标是属于哪一类?
  16. Java语言制作动画
  17. 示波器测量的波形一直抖动怎么办
  18. 针对初创型企业的高新企业认定知识及建议!
  19. @Autowired的用法和作用
  20. 虚拟机安装安装增强失败:modprobe vboxguest failed

热门文章

  1. curl+个人证书(又叫客户端证书)访问https站点
  2. (WPF) DataGrid之绑定
  3. ORACLE 各种闪回操作
  4. 向mvc controller传递json数组
  5. 重温Observer模式--热水器·改(转载)
  6. cs文件中控制页面table的大小、title名称(.aspx)
  7. Angular自学笔记(?)结构型指令
  8. logstash异常
  9. [BZOJ2125]最短路(圆方树DP)
  10. jQuery学习- 位置选择器