多线程编程

本文详细介绍了进程与线程的概念及区别,深入探讨了.NET环境下线程的创建、使用及管理方式,包括线程的生命周期、阻塞模式、传参方法、返回值处理以及线程同步等问题。

进程是程序在内存中的实例,一个进程中可以包含多个线程,线程间的切换速度比进程间的切换速度快,所以在处理多任务的时候,多线程开发显然是首选。

线程只拥有寄存器和内存堆栈,并且只可以使用进程获得的资源。

线程的创建使用的是ThreadStart()这个委托函数,方法原型: 启动调用.Start()方法,由于单核CPU在同一时间内CPU只能处理一条CPU指令,多线程编程实现的并发,实际上是操作系统为cpu分配的时间片轮转,在各个线程间切换。实现了宏观上并行,微观上穿行。进程初始化时,会自动创建一个新线程,为主线程,当主线程执行过程中,自行定义新的线程,为子线程。子线程的生命周期为子线程函数结束。.NET线程执行默认是非阻塞模式,子线程.Start()启动后,并不会立即执行,而是等待主线程时间片结束后,才开始执行子线程。然后:  子线程->主线程->子线程->主线程 。。。 来回切换执行,直到线程生命周期结束。在这个过程中,如果主线程先于子线程结束,那么子线程仍在执行(除非应用程序主动关闭,这时就是强行结束进程,会收回资源,所有线程也就相应结束。),CLR要等到子线程运行结束后,才会结束整个进程。在这个过程中,我们可以调用.Abort()方法来强行结束子线程,这样做的缺点就是会造成资源(文件句柄)的无法回收。.Abort()的调用,会引发一个ThreadAbortException的异常,我们可以在子线程里捕捉到这个异常,并在进行相应的处理,并在finally块中进行资源回收。

线程在创建时,可以设置其Background属性为True(默认是False),该线程就为背景线程,背景线程的含义就是,一旦主线程结束,背景线程就立即结束。倘若在线程创建时,需要等待新创建线程先执行完毕后,再继续执行主线程,则可对子线程调用.Start()方法后再调用.Join()方法,则主线程在该处阻塞,等待子线程生命周期结束后,才继续运行。

使用多线程编程时,最麻烦的就是创建线程时无法传参,也无法有返回值。因为委托ThreadStart()是参数,无返回值类型的。如果需要传参进去,就需要调用另一个委托函数去初始化子线程,ParameterizedThreadStart(),方法原型: ,可以看出,该委托传入的参数是一个Object类型,那么线程的构造函数的参数形式就应该是(Object obj)

 

如果要在子线程中得到返回值,但线程的委托方法是不允许有返回值的。这时候我们就需要构造一个暂存数据的类。在子线程执行的过程中,将数据暂时保存到类的属性中。

 

这样,我们在结束的时候,可以调用obj.returnValue,来获取返回值。不过这样在额外创建一个子线程时,没有错,但在多线程并发时,多线程同时访问临界区(共有程序段),就会导致属性值的混乱。所以在多线程时,还有线程同步问题。

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值