基于.NET的多线程编程入门

简介

多线程在构建大型系统的时候是需要重点关注的一个重要方面, 特别是在效率(系统跑得多快?)和性能(系统工作正常?)之间做一个权衡的 时候。恰当的使用多线程可以极大的提高系统性能。

什么是线程?

每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程 。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合, 或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的 上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通 常由操作系统负责多个线程的调度和执行。

什么是多线程?

多线 程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是 在同一时间需要完成多项任务的时候被实现的。

使用线程的好处有以下 几点:

·使用线程可以把占据长时间的程序中的任务放到后台去 处理

·用户界面可以更加吸引人,这样比如用户点击了一个按钮 去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

·程序的运行速度可能加快

·在一些等待的任务实 现上如用户输入、文件读写和网络收发数据等,线程就比较游泳了。在这种情况 下我们可以释放一些珍贵的资源如内存占用等等。

还有其他很多使用多 线程的好处,这里就不一一说明了。

一些线程模型的背景

我们可 以重点讨论一下在Win32环境中常用的一些模型。

·单线程模型

在这种线程模型中,一个进程中只能有一个线程,剩下的进程必须等待 当前的线程执行完。这种模型的缺点在于系统完成一个很小的任务都必须占用很 长的时间。

·块线程模型(单线程多块模型STA)

这种模 型里,一个程序里可能会包含多个执行的线程。在这里,每个线程被分为进程里 一个单独的块。每个进程可以含有多个块,可以共享多个块中的数据。程序规定 了每个块中线程的执行时间。所有的请求通过Windows消息队列进行串行化,这 样保证了每个时刻只能访问一个块,因而只有一个单独的进程可以在某一个时刻 得到执行。这种模型比单线程模型的好处在于,可以响应同一时刻的多个用户请 求的任务而不只是单个用户请求。但它的性能还不是很好,因为它使用了串行化 的线程模型,任务是一个接一个得到执行的。

·多线程块模型( 自由线程块模型)

多线程块模型(MTA)在每个进程里只有一个块而不是 多个块。这单个块控制着多个线程而不是单个线程。这里不需要消息队列,因为 所有的线程都是相同的块的一个部分,并且可以共享。这样的程序比单线程模型 和STA的执行速度都要块,因为降低了系统的负载,因而可以优化来减少系统 idle的时间。这些应用程序一般比较复杂,因为程序员必须提供线程同步以保证 线程不会并发的请求相同的资源,因而导致竞争情况的发生。这里有必要提供一 个锁机制。但是这样也许会导致系统死锁的发生。

时间: 2024-10-30 14:39:34

基于.NET的多线程编程入门的相关文章

基于.NET平台网络编程入门实战系列 一 序

大学期间,我们学院开了一门叫做C语言的课程,当时的计算机环境的windowXP,外网不让上,只能上校园网,硬盘三无状态,无电影,无音乐,无游戏 ----除了扫雷.正所谓实势造英雄,当时的C语言课造就了一大批扫雷高手,APM (每分钟操作的次数,打过war3的都知道)惊人.牛人多了,自然要争个高下,所以扫雷PK的也是时有发生,但是PK规则都是牛人轮流扫,看谁用的时间少.当时就琢磨着为那批牛人打造一个网络版扫雷,一争高下,哎····大学生就是喜欢想,不愿意做!现在一步一步重构一个基于Socket的网

基于角色的安全性编程入门示例

为了能更好地理解.NET基于角色的安全性,从一个最简单的实例导入角色的应用.首先创建一个简单的控制台程序,如代码清单1-1所示. 代码清单1-1  未添加角色验证的程序 using System; namespace角色实例 { classProgram { static void Main(string[] args) { OutHello(); Console.Read(); } staticvoid OutHello() { Console.WriteLine("hello world!&

c# 多线程编程 入门篇_Delphi

开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解. 先试试这个: procedure TForm1.Button1Click(Sender: TObject);var i: Integer;beginfor i := 0 to 500000 dobegin Canvas.TextOut(10, 10, IntToStr(i));end;end; 上面程序运行时, 我们的窗体基本是 "死" 的, 可以在你在程序运行期间拖动窗体试试... Delphi 为我们提供

基于Delphi的接口编程入门

为什么使用接口? 举个例子好了:有这样一个卖票服务,电影院可以卖票,歌剧院可以卖票,客运站也可以卖票,那么我们是否需要把电影院..歌剧院和客运站都设计成一个类架构以提供卖票服务?要知道,连经理人都可以卖票,很显然不适合把经理人也包括到卖票服务的继承架构中,我们需要的只是一个共通的卖票服务.于是,卖票的服务是个接口,电影院.歌剧院什么的只要都遵循这样一个服务定义就能很好地相互交互和沟通(如果须要的话). 如何在Delphi中使用接口 1.声明接口 IMyInterface = interface(

基于.NET平台网络编程入门实战系列 三

服务器是干啥子用滴?监听客户端,响应客户端用滴! 虽然是世界上最简陋的服务器,但是也有几个注意点: 1.因为要一个死循环监听客户端响应,也就是说无法和用户进行交互了,所以防止前台假死就要为监听新起一个线程: 2.要把新起的线程td.IsBackground = true;设置为后台线程,这样的话线程才会随着应用程序的关闭而关闭,不然的话关了窗体,它还在运行: 3.跨线程问题,在新的线程里改变UI会报跨线程改变UI的错误,所以要用Invoke; 4.在监听的死循环中加入 Thread.Sleep(

基于.NET平台网络编程入门实战系列 二

今天的主要任务就是把单击版的搞定,这是过渡到网络版的必备过程. 如果没有玩过扫雷的,建议先去体验一下:体验完后,自己尝试写出扫雷的算法:经过思考揣摩推敲才能有收获.不建议一上来就下载源码剖析,跟踪代码! 现在我来说下我的思路,如果有更优雅的算法,欢迎大家分享------竞争引发技术进步,分享推动技术进步! [一]单机版扫雷划为两层 第一层为Button,Button盖在Lable上,Lable被隐藏在Button下面: 第二层为Lable, Lable上的背景图片改成地雷图案表示有雷. 雷区的大

Ruby多线程编程初步入门_ruby专题

 传统程序有一个单独的线程执行,包含该程序的语句或指令顺序执行直到程序终止. 一个多线程的程序有多个线程的执行.在每个线程是按顺序执行的,但是在多核CPU机器上线程可能并行地执行.例如,通常情况下在单一CPU的机器,多个线程实际上不是并行执行的,而是模拟并行交叉的线程的执行. Ruby的可以使用 Thread 类很容易地编写多线程程序. Ruby线程是一个轻量级的和高效的在代码中实现并行性.创建Ruby线程: 要启动一个新线程,关联一个块通过调用Thread.new.将创建一个新的线程执行的代码

C++多线程编程时的数据保护_C 语言

 在编写多线程程序时,多个线程同时访问某个共享资源,会导致同步的问题,这篇文章中我们将介绍 C++11 多线程编程中的数据保护.数据丢失 让我们从一个简单的例子开始,请看如下代码:   #include <iostream> #include <string> #include <thread> #include <vector> using std::thread; using std::vector; using std::cout; using std

Linux多线程编程和Linux 2.6下的NPTL

这几天由于工作需要,琢磨了一下Linux下的多线程的相关资料.Linux下最常用的多线程支持库为Pthread库,它是glibc库的组成部分.但是关于Pthread的说明文档非常缺乏,特别是对POSIX多线程规范的介绍以及pthread库中多线程实现方式的介绍实在是少之又少.而多线程编程对于系统程序员而言是必须掌握的技术,因此总是让学习中的程序员觉得头痛不以.我自己也没有太多多线程编程的经验,在这里只是把自己收集到的一些关于Linux上多线程还算新的资料进行汇总来抛砖引玉,以便相互学习交流. 这