`

使用多线程的利弊

 
阅读更多

参考:http://software.intel.com/zh-cn/blogs/2013/04/09/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=%20Multicore%20-duoxiancheng

 

1. Amdahl定律

     一个很简单的量化公式,用来计算一个程序中串行部分所占多少对程序加速比的影响或者用来计算计算机硬件配置中某个设备的速度提高能够将整个系统的速度提高多少。

     假设一个串行程序执行的总时间为1,不能被并行化的部分占的时间比例为p,即串行化的部分为p,可并行化的时间为:1-p。如果用n个核用来加速的话,加速比为:

 

李超

    如果一个程序中只有50%部分能够被并行化,那么即使使用100个核,能达到的最好的加速比为1.98,即不会达到2.除非n无穷大。

     Amdahl就像克莱姆准则一样不能用于实际中,因为很难精确的使用这个公式。我们需要找到程序中所有的串行部分和并行部分。串行部分不仅仅存在于代码中必需的依赖关系,可能还有底层库函数中的串行,还有操作系统的串行部分,甚至还有硬件本身的串行部分。

 

2. 异步应用程序的实现方法

     常见的实现方式有:多线程+同步,异步I/O,非阻塞I/O,信号,事件。异步I/O和非阻塞I/O并不是一回事,当然在有些场合下也会混淆使用。一般来说,异步侧重于表达并行,两个执行流可以同时进行。非阻塞一般还包含一个查询的过程,因为要查询所要进行的操作是否完成。

     异步I/O使用起来难度比多线程大,理解和维护起来的难度一般也比多线程麻烦。同样使用信号也是这个缺点,因为单个线程可以使用同步的方式,线程之间可以使用信号来通信。这样就好像一个人同时做很多件事情和一个团队来协作来完成这些事情的区别一样。后者的执行逻辑会更加清晰,而且多线程+同步的方式能够实现所有异步I/O带来的优势。

     使用UNIX信号的方式有严重的局限性,因为收到信号后所有的逻辑放在一个信号处理函数中执行,这并不是信号处理函数设计的初衷。而且,使用信号会显得程序的组织结构比较混乱,维护起来比较麻烦。

     事件流也是实现异步应用程序的一种方式。一般系统底层会将应用程序收到的各种事件缓冲到一个队列中,然后又底层负责将各种事件对应到一个回调函数上,串行的处理各个事件,即调用各个回调函数。这种方式的最大缺点就是有些事件的回调函数的执行事件比较长,会导致其他事件不能得到很好地相应。在Windows系统的.NET架构上,事件+回调函数是使用的比较多的一种方式。事件流的缺点在于其处理的顺序性。当然事件流+回调函数+多线程是一种不错的选择。

 

3. 编程模型

     各个编程模型的计算能力是等价的,但是对问题抽象层次是不同的。汇编语言在表示程序的结构方面显得比较笨拙,但是使用C语言就将程序的设计结构显式的表现出来了。使用C语言进行数据封装和多态处理显得很笨拙,使用C++就能很好地处理这个问题。使用关系数据库在解决大规模数据问题上显得很笨拙,使用Map-Reduce就能很好的处理某些问题。非线程代码不能显式的表达操作的同步性,使用线程代码就能很好的表达出这些同步性。线程源代码让独立的模块或者松耦合的模块更加清楚的表现出来。

     不同的编程模型对应着不同的抽象层次,对于问题域的抽象恰到好处的抽象模型有助于我们解决更复杂的问题。

 

4. 什么情况下使用线程

     使用线程是有代价的,如果程序是计算密集型且每一步都有依赖,那么使用线程反而会导致效率下降,因为多个线程之间需要切换,还要负责维护锁,信号量等设施。对于可并行的计算密集型问题和I/O与计算可重叠的问题使用多线程一般会达到显著的效果。程序中有多个可并发的模块的时候,使用线程也能提高程序的响应速度。

分享到:
评论

相关推荐

    C#多线程全面编程4例

    在C#编程中,多线程技术是一种关键的并发处理方式,它允许...然而,需要注意的是,虽然多线程可以提升性能,但过度使用或错误地使用多线程可能导致复杂性和bug的增加,因此在设计时需要权衡利弊,合理地利用线程资源。

    VC++多线程与单线程

    因此,需要根据实际情况权衡多线程的利弊,合理地设计线程数量和任务分配。 总结来说,VC++中的多线程和单线程是两种不同的执行模型,各有优缺点。多线程通过并发执行任务提高了程序效率,但需要处理线程同步和通信...

    《多线程编程技术》

    ### 《多线程编程技术》 #### 概念与特性 **多线程编程**是一种软件技术,它允许在单个进程中同时执行多个代码路径,从而...因此,在选择是否使用多线程技术时,开发者需要权衡利弊,并根据具体应用场景作出决策。

    VC中TIMER与多线程的对比.zip

    在VC++编程中,我们经常会遇到需要执行定时任务的情况,这时可以使用TIMER或者多线程来实现。然而,这两种方式在性能和使用场景上存在显著差异。本篇将详细探讨VC++中TIMER与多线程的对比。 首先,让我们了解什么是...

    多线程两种方式和区别总结

    在Java编程中,多线程是并发执行任务的重要机制,它可以提高程序的执行效率和响应速度。本篇文章将深入探讨两种实现多线程的方式:继承`Thread`类和实现`Runnable`接口,并分析它们之间的区别。 首先,让我们了解这...

    C#多线程编程速成

    因此,在设计多线程程序时,需要权衡利弊,合理安排线程的数量和管理策略。 #### 二、多线程的基础操作 C#提供了强大的多线程支持,开发者可以通过`System.Threading`命名空间中的`Thread`类来创建和管理线程。...

    多线程下载MultiThreadDown

    在Android开发中,多线程下载是一项常见的技术,它能够显著提高大文件的下载速度,通过将文件分割成多个部分并同时下载,充分利用网络带宽。本文将详细讲解如何在Android环境中实现多线程下载。 一、多线程下载原理...

    多线程实现的快速搜索文件 注:网上搜索,已经验证.zip

    在IT领域,尤其是在软件开发中,多线程技术是一种常用的方法来提高程序的执行效率,尤其...需要注意的是,虽然多线程能提升性能,但过度使用可能会增加系统复杂性,因此在实际应用中要权衡利弊,合理设计和使用多线程。

    VB多线程

    因此,在设计多线程程序时,需要权衡利弊,合理分配任务和资源。 总结来说,VB多线程是提升程序性能和用户体验的重要手段。通过选择合适的线程创建方式、同步机制和优化策略,开发者可以构建出高效且稳定的多线程...

    Linux多线程编程的基本的函数.pdf

    因此,在设计多线程程序时,需要根据具体需求平衡这两者的利弊。 #### 三、创建线程 在POSIX标准下,创建线程主要通过`pthread_create()`函数来实现,该函数的定义如下: ```c int pthread_create(pthread_t *...

    Oracle 12c 新特性之多线程数据库操作

    如果将其设置为`TRUE`,Oracle将使用多线程架构。这种方式可以提高系统的并发处理能力,减少上下文切换的开销,并可能降低内存占用。 要查看`threaded_execution`参数的默认值,你可以通过SQL*Plus登录到数据库作为...

    Java多线程教程吐血整理干货.md

    #### 多线程的利弊 - **利**: - 线程切换开销远低于进程切换,有助于提高程序的执行效率。 - 在多核CPU环境下,多线程能够充分利用硬件资源,实现真正的并行计算,显著提升程序性能。 - **弊**: - 并发编程复杂度...

    python 多线程共享全局变量的优劣

    全局变量在多线程环境中的使用是其优劣的焦点所在。 一、多线程共享全局变量 在Python中,全局变量是可以在程序的不同模块或函数中访问的变量。当涉及到多线程时,全局变量的特性变得更加复杂。多线程共享全局变量...

    C#线程编程及同步控制

    后台线程。 ### C#线程编程及同步控制 #### .NET环境下的线程概述 在.NET框架中,线程的使用与管理是一项关键技能,...通过合理使用这些机制,开发者可以构建健壮、高效的多线程应用程序,同时避免常见的并发问题。

    C#多线程Singleton(单件)模式模板

    在多线程环境中,确保单例的唯一性尤为重要,因为如果没有正确处理,可能会出现多个线程同时创建实例的情况。在C#中,我们可以利用静态成员和锁定机制来实现线程安全的单例模式。以下是对标题和描述中所述知识点的...

    Servlet线程安全的解决方法

    由于Servlet是单例模式实现的,这意味着每次请求都会复用同一个Servlet实例,因此,在多线程环境下,如何确保Servlet的线程安全就显得尤为重要。 #### 二、解决Servlet线程安全问题的方法 针对Servlet线程安全问题...

    解决js单线程的njs库

    JavaScript,作为一种广泛应用于Web开发的语言,天生具有单线程特性。这意味着在任何给定时间...然而,需要注意的是,过度使用njs可能会增加服务器的复杂性,因此在选择使用njs时,应根据实际需求和项目规模权衡利弊。

    线程基础安全问题、死锁及线程间通信详解

    1、线程概述 1.1、基本概念 进程:正在运行的程序,负责了这个程序的内存空间分配,代表了内存 ...1.2、多线程的利弊 1.2.1、 多线程好处 1、解决一个进程里可以同时执行多个任务; 2、提高了资源的利用率(不是效率)

Global site tag (gtag.js) - Google Analytics