简介 多线程在构建大型系统的时候是需要重点关注的一个重要方面,特别是在效率(系统跑得多快?)和性能(系统工作正常?)之间做一个权衡的时候。恰当的使用多线程可以极大的提高系统性能。
什么是线程? 每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。
什么是多线程? 多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。
使用线程的好处有以下几点:
·使用线程可以把占据长时间的程序中的任务放到后台去处理
·用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
·程序的运行速度可能加快
·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较游泳了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
还有其他很多使用多线程的好处,这里就不一一说明了。
一些线程模型的背景 我们可以重点讨论一下在Win32环境中常用的一些模型。
·单线程模型
在这种线程模型中,一个进程中只能有一个线程,剩下的进程必须等待当前的线程执行完。这种模型的缺点在于系统完成一个很小的任务都必须占用很长的时间。
·块线程模型(单线程多块模型STA)
这种模型里,一个程序里可能会包含多个执行的线程。在这里,每个线程被分为进程里一个单独的块。每个进程可以含有多个块,可以共享多个块中的数据。程序规定了每个块中线程的执行时间。所有的请求通过Windows消息队列进行串行化,这样保证了每个时刻只能访问一个块,因而只有一个单独的进程可以在某一个时刻得到执行。这种模型比单线程模型的好处在于,可以响应同一时刻的多个用户请求的任务而不只是单个用户请求。但它的性能还不是很好,因为它使用了串行化的线程模型,任务是一个接一个得到执行的。
·多线程块模型(自由线程块模型)
多线程块模型(MTA)在每个进程里只有一个块而不是多个块。这单个块控制着多个线程而不是单个线程。这里不需要消息队列,因为所有的线程都是相同的块的一个部分,并且可以共享。这样的程序比单线程模型和STA的执行速度都要块,因为降低了系统的负载,因而可以优化来减少系统idle的时间。这些应用程序一般比较复杂,因为程序员必须提供线程同步以保证线程不会并发的请求相同的资源,因而导致竞争情况的发生。这里有必要提供一个锁机制。但是这样也许会导致系统死锁的发生。
多线程在.NET里如何工作? 在本质上和结构来说,.NET是一个多线程的环境。有两种主要的多线程方法是.NET所提倡的:使用ThreadStart来开始你自己的进程,直接的(使用ThreadPool.QueueUserWorkItem)或者间接的(比如Stream.BeginRead,或者调用BeginInvoke)使用ThreadPool类。一般来说,你可以"手动"为长时间运行的任务创建一个新的线程,另外对于短时间运行的任务尤其是经常需要开始的那些,进程池是一个非常好的选择。进程池可以同时运行多个任务,还可以使用框架类。对于资源紧缺需要进行同步的情况来说,它可以限制某一时刻只允许一个线程访问资源。这种情况可以视为给线程实现了锁机制。线程的基类是System.Threading。所有线程通过CLI来进行管理。
·创建线程:
创建一个新的Thread对象的实例。Thread的构造函数接受一个参数:
Thread DummyThread = new Thread( new ThreadStart(dummyFunction) ); |
·执行线程:
使用Threading命名空间里的start方法来运行线程:
·组合线程:
经常会出现需要组合多个线程的情况,就是当某个线程需要其他线程的结束来完成自己的任务。假设DummyThread必须等待DummyPriorityThread来完成自己的任务,我们只需要这样做:
DummyPriorityThread.Join() ; |
·暂停线程:
使得线程暂停给定的秒
DummyPriorityThread.Sleep(<Time in Second>); |
·中止线程:
如果需要中止线程可以使用如下的代码:
DummyPriorityThread.Abort(); |
·同步
经常我们会遇到需要在线程间进行同步的情况,下面的代码给出了一些方法:
using System;using System.Threading;namespace SynchronizationThreadsExample{ class SynchronizationThreadsExample{ private int counter = 0; static void Main( ) { SynchronizationThreadsExample STE = new SynchronizationThreadsExample(); STE.ThreadFunction( ); } public void ThreadFunction ( ) { Thread DummyThread = new Thread( new ThreadStart(SomeFunction) ; DummyThread.IsBackground=true; DummyThread.Name = "First Thread"; DummyThread.Start( ); Console.WriteLine("Started thread {0}", DummyThread.Name); Thread DummyPriorityThread = new Thread( new ThreadStart(SomeFunction) ); DummyPriorityThread.IsBackground=true; DummyPriorityThread.Name = "Second Thread"; DummyPriorityThread.Start( ); Console.WriteLine("Started thread {0}", DummyPriorityThread.Name); DummyThread.Join( ); DummyPriorityThread.Join( ); } public void SomeFunction( ) { try { while (counter < 10) { int tempCounter = counter; tempCounter ++; Thread.Sleep(1); counter = tempCounter; Console.WriteLine( "Thread {0}. SomeFunction: {1}",Thread.CurrentThread.Name, counter); } } catch (ThreadInterruptedException Ex) { Console.WriteLine( "Exception in thread {0} ", Thread.CurrentThread.Name); } finally { Console.WriteLine( "Thread {0} Exiting. ",Thread.CurrentThread.Name); } } } } |
·使用Interlock
C#提供了一个特殊的类叫做interlocked,就是提供了锁机制的实现,我们可以加入如下的代码实现锁机制:
Interlocked.SomeFunction (ref counter); |
·使用锁
这是为了锁定代码关键区域以进行同步,锁定代码如下:
lock (this){ Some statements ;} |
·使用Monitor
当有需要进行线程管理的时候我们可以使用:
其他也有一些方法进行管理,这里就不一一提及了。
线程的缺点 线程自然也有缺点,以下列出了一些:
·如果有大量的线程,会影响性能,因为操作系统需要在他们之间切换;
·更多的线程需要更多的内存空间
·线程会给程序带来更多的bug,因此要小心使用
·线程的中止需要考虑其对程序运行的影响
·通常块模型数据是在多个线程间共享的,需要一个合适的锁系统替换掉数据共享
相关推荐
多线程编程中,同步和互斥是非常重要的概念,用于确保线程安全,防止数据竞争。VB.NET提供了以下机制: 1. `Mutex`:用于在同一应用程序或不同应用程序间进行线程同步,确保同一时刻只有一个线程访问特定资源。 2. ...
在VB.Net编程中,多线程是一个核心概念,它允许应用程序同时执行多个任务,从而提高程序的效率和响应性。本教程将引导你入门多线程的使用,这对于开发复杂或资源密集...不断实践和学习,你将更加熟练地掌握多线程编程。
本文将深入探讨ASP.NET多线程的基础概念、应用场景以及最佳实践,帮助你从入门到精通。 **1. 多线程基础** 多线程是指在一个应用程序中同时运行多个独立的执行线程。在ASP.NET中,这通常用于后台任务处理,如数据...
《.NET游戏编程入门经典-c#篇》是一本针对初学者的游戏开发指南,主要以C#编程语言为工具,深入浅出地介绍了如何利用.NET框架进行游戏开发。这本书不仅涵盖了基本的编程概念,还涉及到了游戏开发中的关键技术和实践...
VB.NET支持多线程编程,通过线程同步和异步操作,确保游戏流畅运行。 6. **网络编程**:对于多人在线游戏,你需要了解网络通信的基本原理,如TCP/IP协议和套接字编程。.NET框架提供了System.Net命名空间,方便...
通过深入学习《Visual Basic.NET数据库编程从入门到精通》,你不仅可以掌握VB.NET的数据库编程技术,还能了解到如何设计和实现复杂的数据库应用,包括数据验证、用户界面设计、多线程处理和并发控制等。这将为你在...
### .NET平台多线程编程入门 在.NET平台下进行多线程编程是软件开发中的一个关键技能,尤其是在处理复杂的用户交互、数据处理以及后台任务时尤为重要。本篇将详细介绍.NET平台多线程编程的基础知识和技术要点。 ##...
《Visual Basic .NET线程参考手册》是一本深入探讨VB.NET环境下线程编程的重要资源,适合初学者和有一定经验的开发者。线程是现代多任务操作系统中的基本执行单元,理解和熟练掌握线程技术对于开发高效、响应迅速的...
在.NET框架中,多线程编程提供了丰富的工具和类库,如System.Threading命名空间,用于创建和管理线程。 在早期的计算机系统中,操作系统一次只能执行一个任务,通过任务轮转的方式实现多任务的感觉。随着技术的发展...
本文将深入探讨多线程编程的基础知识,以帮助初学者快速入门。 首先,我们需要理解什么是多线程。多线程是指在一个进程中同时执行多个独立的执行线程。在单核CPU系统中,操作系统通过时间片轮转的方式在不同线程...
第一部分 Visual Basic.net基础 第二部分 vb.net的语法部分 第三部分 visual basic.net的运算 第四部分 visual basic.net的常用控件 第六部分 vb.net的OOP...第八部分 vb.net的多线程 第九部分 vb.net的文件和出错处理
这两个概念在.NET框架中扮演着至关重要的角色,尤其是在设计模式和多线程编程中。 首先,让我们了解委托。在C#中,委托是一种类型,它可以引用方法。你可以将它视为一个函数指针,但具有更高的安全性和类型安全性。...
工控上位机往往需要处理实时的数据流,这涉及到数据缓存、队列、多线程和并发控制等技术。学习如何高效地处理和显示实时数据,是保证上位机性能的重要环节。 八、数据库集成 上位机通常需要存储和查询大量的历史...
在VB.NET中,中高级主题通常包括但不限于面向对象编程(OOP)、异常处理、多线程、高级数据访问、文件和流操作、网络编程、反射、委托和事件、LINQ以及自定义控件和用户界面设计。下面,我们将详细探讨这些关键知识...
在Linux系统中,多线程编程是一种常见的编程模式,它允许多个执行流在同一进程中并发运行,从而提高程序的效率和响应性。本篇将深入介绍Linux多线程编程的基本概念、实现方法以及注意事项。 首先,多线程是通过创建...
7. **多线程编程**: C#.NET支持并发和多线程编程,书中的实例可能讲解线程的创建、同步和线程安全。 8. **文件和I/O操作**: 学习如何在C#.NET中读写文件、流和文件系统操作。 9. **网络编程**: 使用C#.NET进行TCP/...
- 多线程编程:理解线程的概念,学习如何创建和管理线程以实现并发执行。 - ADO.NET:用于数据库访问的技术,包括数据集、数据适配器和连接字符串的使用。 本教程将涵盖以上各点,并通过实例教学使初学者逐步熟悉...
《Visual Basic 2010 VB.NET 从入门到精通》是一本专为初学者设计的编程教程,旨在帮助读者全面掌握Visual Basic 2010及其.NET框架的基础知识和高级应用技巧。这本书以深入浅出的方式介绍了VB.NET语言的核心概念、...
.NET将关于多线程的功能定义在System.Threading名字空间中。因此,要使用多线程,必须先声明引用此名字空间(using System.Threading;)。 即使你没有编写多线程应用程序的经验,也可能听说过“启动线程”“杀死...