windows查询每个线程占用的内存_C#多线程

一、基本概念

1、进程

首先打开任务管理器,查看当前运行的进程:

4eeb3f88c174d31e1fcd3b55d4579beb.png

从任务管理器里面可以看到当前所有正在运行的进程。那么究竟什么是进程呢?

进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码。进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的。进程可以理解为一个程序的基本边界。是应用程序的一个运行例程,是应用程序的一次动态执行过程。

二、线程

在任务管理器里面查询当前总共运行的线程数:

b5af57da4cdee16993f6e2e2221cb887.png

线程(Thread)是进程中的基本执行单元,是操作系统分配CPU时间的基本单位,一个进程可以包含若干个线程,在进程入口执行的第一个线程被视为这个进程的主线程。在.NET应用程序中,都是以Main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。线程主要是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。

二、多线程

多线程的优点:可以同时完成多个任务;可以使程序的响应速度更快;可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时间让给别的任务;可以随时停止任务;可以设置每个任务的优先级以优化程序性能。

那么可能有人会问:为什么可以多线程执行呢?总结起来有下面两方面的原因:

1、CPU运行速度太快,硬件处理速度跟不上,所以操作系统进行分时间片管理。这样,从宏观角度来说是多线程并发的,因为CPU速度太快,察觉不到,看起来是同一时刻执行了不同的操作。但是从微观角度来讲,同一时刻只能有一个线程在处理。

2、目前电脑都是多核多CPU的,一个CPU在同一时刻只能运行一个线程,但是多个CPU在同一时刻就可以运行多个线程。

然而,多线程虽然有很多优点,但是也必须认识到多线程可能存在影响系统性能的不利方面,才能正确使用线程。不利方面主要有如下几点:

(1)线程也是程序,所以线程需要占用内存,线程越多,占用内存也越多。

(2)多线程需要协调和管理,所以需要占用CPU时间以便跟踪线程。

(3)线程之间对共享资源的访问会相互影响,必须解决争用共享资源的问题。

(4)线程太多会导致控制太复杂,最终可能造成很多程序缺陷。

当启动一个可执行程序时,将创建一个主线程。在默认的情况下,C#程序具有一个线程,此线程执行程序中以Main方法开始和结束的代码,Main()方法直接或间接执行的每一个命令都有默认线程(主线程)执行,当Main()方法返回时此线程也将终止。

一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码。在C#中,线程是使用Thread类处理的,该类在System.Threading命名空间中。使用Thread类创建线程时,只需要提供线程入口,线程入口告诉程序让这个线程做什么。通过实例化一个Thread类的对象就可以创建一个线程。创建新的Thread对象时,将创建新的托管线程。Thread类接收一个ThreadStart委托或ParameterizedThreadStart委托的构造函数,该委托包装了调用Start方法时由新线程调用的方法,示例代码如下:

Thread thread=new Thread(new ThreadStart(method));//创建线程

thread.Start(); //启动线程

上面代码实例化了一个Thread对象,并指明将要调用的方法method(),然后启动线程。ThreadStart委托中作为参数的方法不需要参数,并且没有返回值。ParameterizedThreadStart委托一个对象作为参数,利用这个参数可以很方便地向线程传递参数,示例代码如下:

Thread thread=new Thread(new ParameterizedThreadStart(method));//创建线程

thread.Start(3); //启动线程

创建多线程的步骤:
1、编写线程所要执行的方法
2、实例化Thread类,并传入一个指向线程所要执行方法的委托。(这时线程已经产生,但还没有运行)
3、调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定

2.1 System.Threading.Thread类

Thread类是是控制线程的基础类,位于System.Threading命名空间下,具有4个重载的构造函数:

96be17d2f242c0bd7c227f0100d08707.png

ThreadStart是一个无参的、返回值为void的委托。委托定义如下:

public delegate void ThreadStart()

通过ThreadStart委托创建并运行一个线程:

b60352efa3a2d619042fd10bc576ca9f.png

运行结果

590babd1f678e7d8ebd61e1b4f65742b.png

除了可以运行静态的方法,还可以运行实例方法

b98dea87e64b6f75aa5ab5f4469dd223.png

运行结果:

d97db1f2d95664f6cbe6bacc92017a23.png

如果为了简单,也可以通过匿名委托或Lambda表达式来为Thread的构造方法赋值

06764724c03ade95e0da4f879d6a734a.png

运行结果:

f35c827c5dfb092fa8b981363354817e.png

ParameterizedThreadStart是一个有参的、返回值为void的委托,定义如下:

public delegate void ParameterizedThreadStart(Object obj)

20da5095c8138c967966bbe60784bbba.png

注意:ParameterizedThreadStart委托的参数类型必须是Object的。如果使用的是不带参数的委托,不能使用带参数的Start方法运行线程,否则系统会抛出异常。但使用带参数的委托,可以使用thread.Start()来运行线程,这时所传递的参数值为null。

191ff04a5b796cd97773416698262e6f.png

aad09cc55f0270ae5de929e937f3e86b.png

本文转载自博客园:https://www.cnblogs.com/dotnet261010/p/6159984.html

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

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

相关文章

linux 录屏软件 按键,linux下常用的截图、录屏工具

linux下常用的截图、录屏工具(2010-01-05 10:47:21)由于和老公一起做一个百度俱乐部的小项目,在编写测试文档时要使用截图、录屏的小工具,于是展开搜索什么工具比较好使。录屏:在linux下常用的录屏工具有5种,可以baidu或者google下…

python x_PythonX

而且你的onTouch里面逻辑也有问题,正确写法:public FloatingView (Context context){super(context);mContext context.getApplicationContext();LayoutInflater mLayoutInflater LayoutInflater.from(context);mView mLayoutInflater.inflate(R.layo…

linux把root用户删了,linux root用户没法删除文件

linux文件有用户或用户组权限,即可对文件进行任何操作。但是除了所有者权限,部分文件系统的文件还有扩展属性。拥有超级权限的用户可以使用chattr的权限增加文件扩展属性,这项指令可改变存放在ext2、ext3、ext4、xfs、ubifs、reiserfs、jfs等…

实体类blob类型_Mysql的数据类型和JPA的实体类

​MySQL中定义数据字段的类型对你数据库的优化是非常重要的。MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。数值类型Int,4字节,(-2147483648,2147483647), (0,4294967295)BIGINT,8 字节,(-9223372036854775808,92…

linux操作系统中查看网络信息的命令,Linux查看系统信息命令盘点

Linux查看系统信息命令盘点在Linux系统上有很多操作都是用命令完成的,下面跟yjbys小编一起来看看最新的系统命令吧,希望对大家有所帮助!1.查看系统内核uname -auname -rfile /sbin/init--通过file命令判断系统中的文件时32位还是64位的--64位CPU系统架构…

python git切换分支_git命令之切换分支

Git一般有很多分支,我们clone到本地的一般都是master分支,如何进行分支的切换呢?那么下面带大家简单的看看如何通过命令来切换:1、查看远程仓库及本地的所有分支命令:git branch -aqinjiaxi:~$ git branch -a* masterr…

Linux作者批评英特尔指令集,英特尔回应 Linus Torvalds 对 AVX512 的批评

英特尔回应 Linus Torvalds 对 AVX512 的批评Linux 作者上个月抨击了英特尔的 AVX512 指令集. 他还希望该指令集能早日成为历史. Torvalds 不是唯一一位批评 AVX512 的人.对于这些批评, 英特尔首席架构师 Raja Koduri 回应称社区喜欢 AVX512, 因为它能带来巨大的性能提升. 他说…

python升级版本命令_如何在python中安装和配置kivy库

kivy是python的UI开发工具包,主要关注用户界面显示效果,可以在Android、IOS、Linux、OS X和Windows上运行。如果python开发中使用kivy,需要安装和配置相关文件和依赖模块。1、在电脑左下角打开开始菜单,输入cmd打开终端窗口在电脑…

linux系统如何安装bt5,BT5硬盘安装(多系统linux + win + BT5)

BT5硬盘安装(多系统linux win BT5)实际上,Win BT5的安装不是很困难,但据我所知我也有两种: 1如官方说明中所述,工具unetbootin,运行unetbootin,在“ CD映像”中,选择BT5的ISO,在“类型”中选…

android主板读取vga线数据_智锐通掘金新基建上新系列之3.5quot; 与ATX工业主板图鉴...

4月份,工信部正式公布了《工业互联网体系架构(版本2.0)》!5G、大数据、人工智能、区块链、边缘计算等新技术加速融入并不断拓宽工业互联网的内涵与赋能潜力。新一代信息技术为驱动的数字浪潮正在深刻重塑经济社会各个领域的当前,智锐通科技聚…

c语言检查字符数组不为空,【C语言】检查输入是否为空,如为空,程序退出

检查用户输入是否为空行,如果输入为空,程序将退出;如不为空,屏幕打印输入的字符串。#include char input[257], *ptr;int main(void){puts("Enter text a line at a time, then pressenter.");puts("Enter a blank…

零基础也能看懂python_零基础也能看懂的Python下载网易云音乐爬虫

PythonSelenium(配置方法参照:Selenium配置)Chrome浏览器(其它的也可以,需要进行相应的修改)解析以前抓取过网易云网页的朋友可能都清楚网易云有反爬虫策略的,post时要对部分信息的参数完成加密函数的模拟。为了方便,入门新手也可…

Python 爬虫之下载视频(五)

爬取第三方网站视频 文章目录 爬取第三方网站视频前言一、基本情况二、基本思路三、代码编写四、注意事项(ffmpeg)总结 前言 国内主流的视频平台有点难。。。就暂且记录一些三方视频平台的爬取吧。比如下面这个: 一、基本情况 这次爬取的方…

c语言程序中的if-else语句,C语言if else语句

C语言中,使用if和else关键字对条件进行判断。请先看下面的代码:#include int main(){ int age; printf("请输入你的年龄:"); scanf("%d", &age); if(age>18){ printf("恭喜,你…

c语言中元音字母对应的的值,c语言输入一个字符串,统计这个字符串的元音字母...

话题:c语言 输入一个字符串,统计这个字符串的元音字母的个数,并输出。回答:英文中的元音字母只有a、e、i、o、u五个,但要考虑大小写问题。码如下:#include "stdio.h"int main(int argc,char *ar[]){int n,i…

c语言json映射,GitHub - xujun621/cson: 基于C语言的json数据映射解析库

CSON基于cJSON,运行于C语言平台的json-struct模型解析工具简介CSON是一个简单的cJSON的二次封装,相比于使用原生cJSON一层一层解析的方式,CSON采用模型映射的方式,使用模型将结构体的特征进行描述,然后根据模型,将json…

cad渐变线怎么画_怎么画压力线和支撑线

支撑线与压力线的基本画法画法:将两个或两个以上的相对低点连成一条直线即得到支撑线将两个或两个以上的相对高点连成一条直线即得到压力线用法:1.支撑线和压力线的作用支撑线又称为抵抗线。当股价跌到某个价位附近时,股价停止下跌&#xff0…

飞行棋 c语言,骑士飞行棋【纯c】

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include int flag1 1, flag2 1;int map[100]{0,0,0,0,0,1,2,0,0,3,0,0,0,1,0,0,0,1,0,0,4,0,0,2,0,4,0,3,0,0,0,0,0,1,0,1,0,2,0,0,0,0,4,0,0,0,0,1,0,0,0,0,2,0,0,0,0,3,0,0,4,1,0,0,0,0,0,0,0,2,0,0,4,0,0,…

python ansible模块_python学习-ansible简单使用1

一、介绍Ansible 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年创建成立。Ansible 基于 Python 语言实现,由 Paramiko 和 PyYAML 两个关键模块构…

动画制作c语言程序,C语言动画制作

#include "user-def.H"void main(){ int i; printf("简单动画演示程序\n"); for(i0;i<5;i) display_picture(); printf("\n\t\t\t\tTest\n"); system("pause");}/* user_def.h */#ifndef _user_def_H #de…