C# —— 进程与线程的理解

定义

进程

进程(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#多线程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git安装和初步使用

基本参照以下链接&#xff1a; http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000 注意&#xff1a; &#xff08;1&#xff09;每台电脑对于github来说都有对应的ssh密钥&#xff0c;…

【TensorFlow】——broadcast_to(在不复制内存的情况下自动扩张tensor)

目录 作用&#xff1a; 内在的思路 优点 什么时候可以broadcast ​ tf.boradcast_to .VS tf.tile 作用&#xff1a; 在不会实际意义上复制数据的情况下进行tensor的维度和形状的扩张&#xff0c;使得两个tensor维度和形状一致 对两个维度不一致的tensor进行加减前进行br…

20145212 《信息安全系统设计基础》第2周学习总结

20145212 《信息安全系统设计基础》第2周学习总结 教材学习内容总结 Vim基本操作 1.使用vim命令进入vim界面vim后面加上你要打开的已存在的文件名或者不存在&#xff08;则作为新建文件&#xff09;的文件名。 打开Xfce终端&#xff0c;输入以下命令$ vim practice_1.txt 直接使…

Opencv—— 拟合直线

概念 最小二乘法是勒让德( A. M. Legendre)于1805年在其著作《计算慧星轨道的新方法》中提出的。 最小二乘法就是通过最小化误差的平方和&#xff0c;使得拟合对象无限接近目标对象。在图像处理中主要用于拟合线&#xff0c;通过求采样点距离误差最小的线&#xff0c;可以是直…

本地搭建Dubbo监控中心的安装步骤

Dubbo监控中心的安装步骤 参考链接&#xff1a;http://blog.csdn.net/lichunan/article/details/40349645 一、从github上下载dubbo源码进行编译&#xff1a; 1、下载地址为&#xff1a; https://github.com/alibaba/dubbo.git2、编译源码命令&#xff1a;首先进入~/dubbo&am…

(转)SQLServer实例讲解

欢迎和大家交流技术相关问题&#xff1a; 邮箱: jiangxinnju163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://www.zhihu.com/people/jiangxinnju 实例就是一个在数据库中存在的&#xff0c;现实的数据…

Basler相机SDK相关问题收集与知识汇总

1.心跳时间导致报错 此心跳非彼心跳,相机心跳是指过通过设置一个时间用于监测相机和网卡的连接,如果超过这个时间,相机就会释放跟网卡的连接,进入一种允许相机被再次连接的状态。 但此方式会导致相机SDK报错,经常显示在使用中,无可用连接,如何解决? 1.干等。不可取 2.…

14-会场安排问题

会场安排问题 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述学校的小礼堂每天都会有许多活动&#xff0c;有时间这些活动的计划时间会发生冲突&#xff0c;需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动&#xff0c;…

【TensorFlow】——实现minist数据集分类的前向传播(常规神经网络非卷积神经网络)

目录 一、常规神经网络模型 二、TensorFlow实现前向传播步骤 1、读取数据集 2、batch划分 3、根据神经网络每一层的神经元个数来初始化参数w,b 4、进行每一层输入输出的计算 5、对每一层的输出进行非线性relu函数变换 6、计算一个batch训练后的误差loss 7、计算每一次…

大道至简第二章

懒人造就了方法 开头说的&#xff0c;有一个人叫李冰也要移山&#xff0c;可是他却要用和愚公截然不同的方法&#xff0c;那就是用“烧”的方法来碎石&#xff0c;那么这样的好处就是省力。那么他又是怎样想到的办法的呢&#xff0c;就是生活中仔细观察他老婆做饭时水溢出是石头…

C# 回调函数详解

回调和回调函数是什么 软件模块之间存在着接口&#xff0c;而回调是一种双向调用模式&#xff0c;被调用方在接口被调用时也会调用对方的接口。 对于一般的结构化语言&#xff0c;可以通过回调函数来实现回调。回调函数是一个函数或过程&#xff0c;是一个由调用方自己实现&am…

神经网络(11)--具体实现:unrolling parameters

我们需要将parameters从矩阵unrolling到向量&#xff0c;这样我们就可以使用adanced optimization routines. unroll into vectors costFunction与fminunc里面的theta都是n1维的向量&#xff0c;costFunction的返回值gradient也是n1维的向量。 但是当我们使用神经网络时&#x…

[转]ASP.Net篇之Session与Cookie

本文转自&#xff1a;http://www.cnblogs.com/japanbbq/archive/2011/08/31/2160494.html Session: Session是“会话”的意思&#xff0c;然而&#xff0c;因为http协议是无状态的&#xff0c;那么每次客户端请求服务器端&#xff0c;服务器端都会以“崭新”的页面展示给客户端…

C# 接口详解

概念 接口描述的是可属于任何类或结构的一组相关行为&#xff0c;所以实现接口的类或结构必须实现接口定义中指定的接口成员。 定义&#xff1a;使用interface 关键字&#xff0c;由方法、属性、事件、索引器或这四种成员类型的任意组合构成。另可使用new、public、protected、…

js学习之地图生成

首先&#xff0c;上地图图片 接着&#xff0c;js&#xff0c;我们可以把图片看成一块块32*32像素的 var i; var j;window.onload function () {gamemap(15, 10, 10, "map.jpg"); }var mapimg new Image(); var map [[18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,…

linux性能分析常用的命令

1&#xff0c;uptime 查看系统负责2&#xff0c;more 分页查看文件&#xff0c;enter显示下一行&#xff0c;空格显示下一页&#xff0c;F显示下一屏&#xff0c;B显示上一屏内容。3&#xff0c;top命令查看系统情况&#xff0c;按shif H可以查看当前线程的负载。4&#xff0…

C#中Console.ReadKey()与ConsoleKey的一些用法

1.控制台程序不让窗口闪过 对于控制台程序&#xff0c;Console.ReadKey()可以使窗口停留一下&#xff0c;直到点击键盘任一键为止。 2.通过按键进行选择 key Console.ReadKey(true).Key;if (key ConsoleKey.S){ Console.Write("Input the message:…

【TensorFlow】——Windows10、pycharm、Python3.6.4中安装CPU和GPU两种版本的TensorFlow

tensorflow分为两种&#xff0c;一种是cpu版本&#xff0c;一种是gpu版本 CPU版本可以直接通过pip进行安装&#xff1a; 这里是在国内镜像源中进行的下载&#xff0c;下载的版本是2.2.0版本 pip --default-timeout1000 install tensorflow-cpu2.2.0 -i http://pypi.douban.c…

vsftpd.conf 详解与实例配置

#################匿名权限控制############### anonymous_enableYES   #是否启用匿名用户 no_anon_passwordYES   #匿名用户login时不询问口令 下面这四个主要语句控制这文件和文件夹的上传、下载、创建、删除和重命名。 anon_upload_enable&#xff08;yes/no)…