使用单线程还是多线程的问题

转载 2016年06月01日 22:05:26

对于处理时间短的服务或者启动频率高的要用单线程,相反用多线程! 
不论什么时候只要能用单线程就不用多线程,只有在需要响应时间要求比较高的情况下用多线程

某次操作允许并发而且该操作有可能阻塞时, 用多线程. 例如SOCKET, 磁盘操作.

使用多线程编程可以给程序员带来很大的灵活性,同时也使原来需要复杂技巧才能解决的问题变得容易起来。但是,不应该人为地将编写的程序分成一些碎片,让这些碎片按各自的线程执行,这不是开发应用程序的正确方法。 线程很有用,但当使用线程时,可能会在解决老问题的同时产生新问题。

例如要开发一个字处理程序,并想让打印功能作为单独的线程自己执行。这听起来是很好的主意,因为在打印时,用户可立即返回,开始编辑文档。但这样一来,在该文档被打印时文档中的数据就有可能被修改,打印的结果就不再是所期望的内容。也许最好不要把打印功能放在单独的线程中,不过,如果一定要用多线程的话,也可以考虑用下面的方法解决:第 一种方法是锁定正在打印的文档,让用户编辑其他的文档,这样在结束打印之前,该文档不会作任何修改;另一个方法可能更有效一些,即可以把该文档拷贝到一个临时文件中,打印这个临时文件的内容,同时允许用户对原来的文档进行修改。当包含文档的临时文件打印完成时,再删去这个临时文件。 
通过上面的分析可以看出,多线程在帮助解决问题的同时也可能带来新问题。因此有必要弄清楚,什么时候需要创建多线程,什么时候不需要多线程。总的来说,多线程往往用于在前台操作的同时还需要进行后台的计算或逻辑判断的情况,而对于GUI(图形用户 接口),除了开发MDI(多文档界面)应用程序外,应尽量不使用多线程。

多线程

1、就如多了几副碗筷,可以抢占更多的系统资源,加快可以分割成独立执行单元的程序段运行

2、提供良好的操作感受:不在UI主线程执行费时的作业(这些作业以线程运行)

3、响应多个并行的请求

简单的顺序执行方式不能满足要求的时候需要考虑多线程实现,或者有些多任务管理时也需要用到多线程,否则无法并行执行不同功能等等。

单线程好比所有工作都要你自己干,那样你只能一样一样来,多进程好比你把这些工作分给若干人,大家同步进行,同步进行的好处是大家各干各的,除了接口外,其他工作都独立完成,这样不管是逻辑还是时间上都更加合理,就好象你们单位的若干部门协调工作一样。如果所有部门的工作都要你们老总一个人干,那就是单线程了。你明白了多线程的道理,想学多线程就非常简单了,mfc给你提供了若干实现多线程的函数和机制,直接调用就好,当然你还要注意资源共享,数据独占,互斥量等一些问题。

----------------------------------------------------------------------------------------------------------

多线程就是可以同时做N件事情而不用堵塞在那里,

多线程主要处理好同步问题

什么时候该使用多线程,以及更恰当的多线程编程方法之讨论

大约在写了一年左右的应用程序以后开始发生了一些困惑,在我写的程序中很多使用了多线程,我们了解使用线程的必要性,但是什么时候使用,以及该如何更好使用和管理多线程方面,我觉得值得思考。

先讨论一下CApp类的实质。App就是一个用户界面线程。

众所周知,CApp类继承于CWinThread类,是一个线程类,它的实例就是应用程序的主线程(一个用户界面线程)。App 实例化一个WinThread以后,主要的工作就是维护一个消息循环,直到收到程序退出消息,退出循环并终止线程。

可见App对象使一个线程具有了处理消息的能力,而线程本身并没有这个能力,(了解这一点的目的在于弄清楚线程消息的概念。)拥有这种能力的线程也就是用户界面线程。

一个线程就是一个代码的执行路径,如果没有App那么线程将按照一个固定的路径执行代码,不会受到任何外界情况的干扰(除非是CPU掉电,或者发生了硬件中断)。显然这不是我们想要看到的,于是如何控制一个线程的运行便成为了一个需要解决的问题,操作系统大多采用了消息机制的解决方案。所谓的消息是一种抽象的概念,其实就是一个操作系统的数据结构,一个可以被App主线程消息循环函数接受的参数。有了消息还不够,还必须要有发送消息的对象。这个对象一般是窗口,窗口作为用户界面线程的一部分用以接受各种事件,事件发生以后,窗口线程就向(自己)线程的消息队列里发送事件所对应的消息。消息的发出者还可以是主线程的其它子线程,也可以是主线程自身(窗口),当然也可以是操作系统。了解了消息机制的原理以后可以对我们编程提供一些帮助,比如,App主线程中不应该执行耗时很长的代码(比如循环,或者I/O操作,或者运算量很大的代码),这样才不会阻塞消息循环,导致界面“死掉”。 解决这个问题的方案就是创建子(辅助)线程来完成这些任务。

这里要指出的几点是:(注:以下所说的子线程皆指辅助线程,而非界面线程)

1.主线程不可以向子线程发送消息(但是反之则可以),这种做法本身没有任何意义,是概念不清的问题;

2.当窗口要向子线程发送消息时;这个问题也是本文讨论的重点。首先,子线程没有处理消息的能力,它只能按照原先设定好的路径运行。所以窗口只能将消息发送给主线程,再由主线程想办法改变子线程的行为。主线程如何跟子线程通讯呢?(显然不能用消息)我所能想到的就是主线程改变一些公共域的值,然后由子线程通过轮询的方式来实现通讯。这也是windows给我们提供的方法,当我们使用AfxBeginThread或者CreateThread创建一个子线程的时候,会传入一个对象的指针,很显然,这个对象就是控制子线程的关键。

至此了解了什么时候使用多线程的问题。

第2个问题:如何更好的使用多线程

首先是代码结构的问题。我们可以将子线程所要完成的功能全部在一个线程函数里实现,这显然在大多数时候是不合理的,第二种方法是通过父线程传递来的对象指针,调用该对象类的成员函数来实现所需的功能。这里引发新的问题,需不需要单独创建一个类来包装这些函数,还是将这些函数写在父线程的类中(包括辅助线程处理函数自己)。这两种方法从本质上来说似乎没有什么差别。后者的话,当我们需要改变子线程的行为时,只需要改变自身类成员变量就可以了,但是结构显得有些混乱。

转自http://blog.163.com/loveyingchun_1314/blog/static/238242512011112284128908/

相关文章推荐

R语言多线程运算(解决R循环慢的问题)

已经大半年没有更新博客了。。最近都跑去写分析报告半年没有R 这次记录下关于R循环(百万级以上)死慢死慢的问题,这个问题去年就碰到过,当时也尝试过多线程,but failed......昨天试了下,...

单线程和多线程访问数据库性能比较一性能比较部分(oracle 数据库)

单线程和多线程访问数据库性能比较(oracle 数据库,C++Builder实现,odac4)说明:本文主要说明单线程和多线程访问数据库性能的性能比较,关键词在数据库(DataBase),线程(Thr...

单线程与多线程的区别

什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。 而一个进程又是由多个线程所组成的。 什么是线程? 线程是程序中的一个执行流,每...

程序什么时候应该使用线程,什么时候单线程效率高

对于处理时间短的服务或者启动频率高的要用单线程,相反用多线程! 不论什么时候只要能用单线程就不用多线程,只有在需要响应时间要求比较高的情况下用多线程 某此操作允许并发而且该操作有可能阻塞时, 用...

为什么要有多线程?

为什么要有多线程? 单线程,就是指单个流水线的进程(A→B→C),这样的效率不太高。 多线程,指多个单线程同时进行,效率高。 生活场景: 购买电脑时,销售人员介绍这...

VC++ 如何创建一个线程并传递参数

  近来做个项目需要写点程序,比较烦.net写的老是需要背着.net包走,所以准备用VC++来写,其中用到了线程方面的知识这里记录下来以备后用。  创建一个工作线程十分简单,只需要两步你的线程就能跑了...

大数据下多线程对文件的检索

今儿在服务器上处理了一个30G+的文件,把Xmx飚到了128000m,感觉一般般,现把代码贴出来,借以抛砖引玉 1、开辟1000个线程操作3.6E数据对其进行检索,为保证负载均衡,999个线程每个线程...

多线程和单线程的执行效率问题

多线程和单线程的执行效率问题 转:平凡之路的博客 一提到多线程一般大家的第一感觉就是可以提升程序性能,在实际的操作中往往遇到性能的问题,都尝试使用多线程来解决问题,但多线程程序并不...

servlet的生命周期,servlet是单线程还是多线程(基础问题)

Servlet的生命周期有三个阶段: 1.初始化阶段,调用init()方法; 2.响应客户请求阶段,调用service()方法; 3.终止阶段,调用destroy()方法; Servlet初始化阶段:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用单线程还是多线程的问题
举报原因:
原因补充:

(最多只允许输入30个字)