精华内容
下载资源
问答
  • 不论什么时候只要能用单线程就不用多线程,只有在需要响应时间要求比较高的情况下用多线程 某此操作允许并发而且该操作有可能阻塞时, 用多线程. 例如SOCKET, 磁盘操作. 使用多线程编程可以给程序员带来很大的灵活...

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

    某此操作允许并发而且该操作有可能阻塞时, 用多线程. 例如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个问题:如何更好的使用多线程

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

    展开全文
  • 不论什么时候只要能用单线程就不用多线程,只有在需要响应时间要求比较高的情况下用多线程。某操作允许并发而且该操作有可能阻塞时,用多线程。 线程很有用,但当使用线程时,可能会在解决老问题的同时产生新问题。...

    程序什么时候应该使用线程?

        使用多线程编程可以给程序员带来很大的灵活性,同时也使原来需要复杂技巧才能解决的问题变得容易起来。不论什么时候只要能用单线程就不用多线程,只有在需要响应时间要求比较高的情况下用多线程。某操作允许并发而且该操作有可能阻塞时,用多线程。


    线程很有用,但当使用线程时,可能会在解决老问题的同时产生新问题。例如要开发一个字处理程序,并想让打印功能作为单独的线程自己执行。这听起来是很好的主意,因为在打印时,用户可立即返回,开始编辑文档。但这样一来,在该文档被打印时文档中的数据就有可能被修改,打印的结果就不再是所期望的内容。也许最好不要把打印功能放在单独的线程中,不过如果一定要用多线程的话,也可以考虑用下面的方法解决:

    第一种方法是锁定正在打印的文档,让用户编辑其他的文档,这样在结束打印之前,该文档不会作任何修改;

    第二个方法可能更有效一些,即可以把该文档拷贝到一个临时文件中,打印这个临时文件的内容,同时允许用户对原来的文档进行修改。当包含文档的临时文件打印完成时,再删去这个临时文件。

    通过上面的分析可以看出,多线程在帮助解决问题的同时也可能带来新问题。因此有必要弄清楚,什么时候需要创建多线程,什么时候不需要多线程。总的来说,多线程往往用于在前台操作的同时还需要进行后台的计算或逻辑判断的情况,而对于GUI(图形用户接口),除了开发MDI(多文档界面)应用程序外,应尽量不使用多线程。


    多线程
    1、就如多了几副碗筷,可以抢占更多的系统资源,加快可以分割成独立执行单元的程序段运行
    2、提供良好的操作感受:不在UI主线程执行费时的作业(这些作业以线程运行)
    3、响应多个并行的请求


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

    单线程好比所有工作都要你自己干,那样你只能一样一样来,多进程好比你把这些工作分给若干人,大家同步进行,同步进行的好处是大家各干各的,除了接口外,其他工作都独立完成,这样不管是逻辑还是时间上都更加合理,就好象你们单位的若干部门协调工作一样。如果所有部门的工作都要你们老总一个人干,那就是单线程了。


    什么时候单线程效率高?

    对于处理时间短的服务或者启动频率高的要用单线程,相反用多线程!

    展开全文
  • redis 采用网络IO路复用技术来保证在连接的时候,系统的高吞吐量。 路-指的是个socket连接,复用-指的是复用一个线程路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的路复用...

    在这里插入图片描述
    redis 采用网络IO多路复用技术来保证在多连接的时候,系统的高吞吐量。
    多路-指的是多个socket连接,复用-指的是复用一个线程。多路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的多路复用技术。
    这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路I/O
    复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了Redis具有很高的吞吐量。
    在这里插入图片描述
    因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,所以采用单线程的方案。
    在这里插入图片描述

    展开全文
  • 在开发Socket项目的时候,如果是开发一个自己玩玩,当然不用考虑效率、安全性等问题,可是如果是一个企业级的,你就不得不关注这几点。... 一开始,大家会编出一个[color=blue]单线程[/color]的...
    在开发Socket项目的时候,如果是开发一个自己玩玩,当然不用考虑效率、安全性等问题,可是如果是一个企业级的,你就不得不关注这几点。本系列文章将我们实验室里的Socket程序变成企业级的应用。
    NIO编程肯定是一个很好的解决方案,不过这部分留在以后讨论。今天我想说说如何让你的阻塞的Scoket程序高效、安全的跑起来。
    一开始,大家会编出一个[color=blue]单线程[/color]的Scoket程序,然后我们发现这个程序根本不能够连接多个客户端,于是我们引入“[color=blue]多线程[/color]”,使我们的程序能够同时处理多个客户端。
    我相信,到现在为止如果没有深入研究过Socket编程,大家一般还是停留在“一客户一线程”的初级模式。如果是个位数的客户,当然你不会发现什么明显的性能问题。但是如果你的客户连接数量达到百位级,我靠,你的CPU就关顾着在各个线程间切换,你的内存似乎也有些吃不消了(每个线程都有自己独立的内存),更多的系统资源的消耗,更多的线程上下文转换,更复杂的线程管理(OS有一套自己的机制),将拖垮你的application。再加上多客户端尝试并发连接,及时响应客户端的连接将变得像癞蛤蟆追求天鹅一样不给力,因为线程的创建将占用服务器大量的CPU周期。
    从[color=blue]单线程[/color]到[color=blue]多线程[/color]我们没法解决的问题,必然有新的英雄站出来解决,他就是“[color=blue]线程池[/color]”。
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.logging.Level;
    import java.util.logging.Logger;


    /**
    * ThreadPool演示
    * @project : socket
    * @author 贾懂凯 @ netjava
    * @date 2010-12-14 下午12:24:40
    * @since jdk1.6.0_10
    */
    public class TCPServerPool {

    public static void main(String args[]) throws IOException{
    //ensure the parameter is right!
    if(args.length!=2){
    throw new IllegalArgumentException("Parameter(s):<port> <ThreadSize>");
    }
    int server_port=Integer.parseInt(args[0]);
    int threadpool_size=Integer.parseInt(args[1]);

    //create a server socket to accept client connection requests
    final ServerSocket serSock=new ServerSocket(server_port);
    final Logger logger=Logger.getLogger("thredPoolLog");

    //spawn a fixed number of threds to service clients
    for(int i=0;i<threadpool_size;i++){
    Runnable run=new Runnable(){

    public void run() {
    while(true){
    try {
    Socket clientSock=serSock.accept();
    /**
    * 把它交给一个独立的handler处理
    * 你可以将handler定义为一个独立的线程(注意性能)
    * 或者定义为一个静态方法(注意并发的同步问题)。
    */
    } catch (IOException e) {
    logger.log(Level.WARNING,"Client accept failed",e);
    }
    }
    }
    };
    Thread t=new Thread(run,"Thread-"+i);
    t.start();
    logger.info("create and start a thread named "+t.getName());
    }
    }

    }

    这里我为accept()方法加上了[color=blue]线程池[/color],我们发现,我们不必担心少量的多个客户并发连接的问题了,因为有多个线程对应的accept()在等待客户端连接进来。一旦客户成功连接进来,该线程重新返回线程池。如果并发访问的客户端超过线程池的size,那么连接请求将在网络中形成一个队列等待,这明显是不利于维护的,并且线程的大小没有适应性,因为它总是一成不变的。
    并且连接进来的客户端显然不能交给单独的线程来处理,否则我们控制线程数量过多造成的性能瓶颈的初衷将无疾而终。不过,如果给连接进来的客户端创建一个线程池,就要考虑到维护问题,我们创建一个等待队列,来维护那些超过客户端线程池size的线程。这样将引起一致命的问题,如果其中有几个正在接受服务的线程阻塞等待或者由于未捕获异常死亡,在等待队列中的线程将因迟迟得不到资源而被饿死。
    线程池的初步使用出现了这么多问题,问题总是伴随着被解决的可能性诞生的,就像出现了怪兽总会出现奥特曼一样,于是我们的英雄又出现了-“[color=blue]Executor[/color]”,它是系统提供的,它可以帮助我们来管理线程池。
    如何管理,待我吃完饭回来继续……(见下一篇)
    展开全文
  • 在介绍多线程时候,我们首先要知道什么是线程,而要了解线程还要了解进程。 1.进程:一个正在执行中的程序,每个进程执行都有一个执行顺序,该顺序是一个执行路径,或者是一个控制单元(个人偏向这种 )。 2.线程...
  • 以前我认为多线程的作用就是提升性能。实际上,多线程并不一定能提升...这时候可以采用多线程,我感觉就等于是异步调用。这样的例子有很多:  ajax调用,就是浏览器会启一个新的线程,不阻塞当前页面的正常操作; ...
  • 什么用多线程

    千次阅读 热门讨论 2018-01-16 15:01:43
    以前我认为多线程的作用就是提升性能。实际上,多线程并不一定能提升性能(甚至还会降低...这时候可以采用多线程,我感觉就等于是异步调用。这样的例子有很多:  ajax调用,就是浏览器会启一个新的线程,不阻塞当前
  • 在Windows编程中,多线程一定比单线程快吗?什么时候用多线程什么时候用单线程?它们各自的应用场景是什么?
  • Redis为什么用单线程 在我们采用多线程的情况下,如果没有良好的系统设计,得到的效果其实并不好。 在redis的场景下,会存在共享同一个数据结构的场景,当多个线程共享同一个数据结构的时候,为了保证共享资源...
  • 多线程什么用

    2017-02-23 10:51:00
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。作者:pansz链接:file:///question/19901763/answer/...多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜...
  • 多线程什么用? 最近看了多线程讲解很模糊 这么解释问题吧:1。单进程单线程:一个人在一个桌子上吃菜。2。单进程多线程:多个人在同一个桌子上一起吃菜。3。多进程单线程:多个人每个人在自己的桌子上吃菜。...
  • 问题:多线程什么用? 回答一 这么解释问题吧: 1。单进程单线程:一个人在一个桌子上吃菜。 2。单进程多线程:多个人在同一个桌子上一起吃菜。 3。多进程单线程:多个人每个人在自己的桌子上吃菜。 ...
  • 使用单线程还是多线程的问题

    千次阅读 2016-06-01 22:05:26
    不论什么时候只要能用单线程就不用多线程,只有在需要响应时间要求比较高的情况下用多线程 某此操作允许并发而且该操作有可能阻塞时, 用多线程. 例如SOCKET, 磁盘操作. 使用多线程编程可以给程序员带来很大的灵活...
  • 多线程什么用

    千次阅读 2018-04-15 15:11:32
    多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了。。。此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会...
  • 单线程多线程选择处理

    千次阅读 2013-03-19 20:54:49
    不论什么时候只要能用单线程就不用多线程,只有在需要响应时间要求比较高的情况下用多线程某此操作允许并发而且该操作有可能阻塞时, 用多线程. 例如SOCKET, 磁盘操作. 使用多线程编程可以给程序员带来很大的灵活...
  • 声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!! 文章目录 一、单线程程序 ...2、那么我们为什么还要设计多线程程序呢? 3、另外我们能不能够...
  • 经常遇到小伙伴提到python是单线程的,写代码的时候用多线程没有意义,今天与大家分享一下关于python的单线程与多线程相关理解。 首先 python是单线程的 这句话是不对的。 这里要提到一个概念:Python的全局解释器锁...
  • CPU在切换线程的时候,有一个上下问切换事件,而这个切换时间是非常耗时的 一个CPU主频是2.6GHz,这意味着每秒...为什么一般是在I/O操作的时候,要用多线程呢? 因为I/O操作一般可以分为两个阶段,即等待I/O准备就...
  • redis单线程什么还快的个人解释

    千次阅读 2019-05-30 00:18:06
    (心里卧槽,就是单线程所以快啊,还说多线程什么事,难道是我哪块的知识点出了问题了?) 对,这是一次真实的面试,没想到快被烂的redis,竟然让人这样问住了,其实道理我知道,但一时突然语塞,真不知道怎么解释...
  • 当有很多个文件需要进行... 首先,我写了一段读文件的程序,这个程序支持用单线程/多线程两种方式读入多个文件,并且记录整个读文件的耗时,最后来比较一下单线程/多线程两种模型在读文件上的性能差别: Java代...
  • 一、什么时候应该使用多线程? 今天看到一个问题,突然有感而发,想聊下这个话题。 不知道大家有没有想过这个问题,就是什么时候我该使用多线程呢?使用多线程就一定会提升系统性能吗? 1、其实是否应该使用多线程在...
  • 什么要有多线程

    2019-10-06 17:47:43
    单核计算机不适合用多线程吗? 适合,比如单核cpu同时只能做一件事情,就是执行一个线程。如果用单线程,程序io,cpu就等待出来了,空闲了。就可以使用多线程来提供cpu利用率。但是多个线程执行的时候cpu来回切换,...
  • 最近比较比较清闲,复习了下设计模式中的单例模式,对于单例模式,网上有很多实例,但是看来看去,很多感觉老是差点什么,当然也有比较多的写...下面就分为在单线程中和多线程的来记录吧!  在单线程中,网上有很...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 534
精华内容 213
关键字:

什么时候用单线程什么时候用多线程