并发编程

并发编程

摘要: <!-- p { margin-bottom: 0.25cm; line-height: 120%; } --> 并发编程之内存可见性 在上篇线程安全中,我们已经知道需要使用锁来同步管理对可变状态的访问操作。今天我们来看下并发编程的内存可见性问题。 同步代码块除了实现原子性或者临界区之外,其还保证了阅读全文
posted @ 2016-03-07 22:36 无风听海 阅读(284) | 评论 (0) 编辑
 
摘要: 并发编程之线程安全性 一、什么是线程安全性 并发编程中要编写线程安全的代码,则必须对可变的共享状态的访问操作进行管理。 对象的状态就是存储在实例或者静态变量中的数据,同时其状态也包含其关阅读全文
posted @ 2016-03-07 06:45 无风听海 阅读(876) | 评论 (2) 编辑
 
摘要: 并发编程的几种形式 在并发编程中我们经常听到以下一些概念,今天我将尝试进行阐述。 一、并发 同时干多件事情,这就是并发的作用。 web服务器可以利用并发同时处理大量用户的请求。 只要我们阅读全文
posted @ 2016-03-04 00:12 无风听海 阅读(1018) | 评论 (2) 编辑
 
摘要: <!-- p { margin-bottom: 0.25cm; line-height: 120%; } --> 并发编程简介 与串行程序开发相比,并发编程的难度更大,编写、调试、维护都很困难,导致很多开发人员图省事放弃并发编程。但是现在已经进入了多核移动互联时代,现在连入门级的手机都是多核的,所以阅读全文
posted @ 2016-03-02 23:33 无风听海 阅读(431) | 评论 (0) 编辑
 
摘要: 使用Parallel.Invoke并行你的代码 优势和劣势 使用Parallel.Invoke的优势就是使用它执行很多的方法很简单,而不用担心任务或者线程的问题。然而,它并不是适合所有的场景。Parallel.Invoke有很多的劣势 如果你使用它来启动那些需要执行很长时间的方法,它将会需要很长时间才能返回。这可能会导致很多的核心在很长时间都保持闲置。因此,使用这个方法的时候测量执行速度和逻辑核心使用率很重要。 它对并行的伸缩性有限制,因为它只能调用固定数目的委托。在前面的例子中,如果你在一个有16个核心的电脑上执行,它将只会并行启动四个方法。因此,12个逻辑核心仍然保持闲置。 每次使用这个.阅读全文
posted @ 2012-07-02 04:31 无风听海 阅读(3062) | 评论 (1) 编辑
 
摘要: 基于任务的并发编程之Parallel.Invoke(一) 如果想并行执行很多方法,最便捷的方式就是使用Parallel类提供的新方法Invoke方法。例如,假设你有下边四个独立的方法,每个方法执行一个格式化转换,并且你们确定并行执行它们是安全的。Ø ConvertEllipsesØ ConvertRectanglesØ ConvertLinesØ ConvertText为了启动这些无参返回值为空的函数时充分利用潜在的并行优势,你可以使用下边这行代码:Parallel.Invoke(ConvertEllipses,ConvertRectangles,Con阅读全文
posted @ 2012-06-25 23:33 无风听海 阅读(1194) | 评论 (0) 编辑
 
摘要: 命令式数据并行 Visual C# 2010和.NETFramework4.0提供了很多令人激动的新特性,这些特性是为应对多核处理器和多处理器的复杂性设计的。然而,因为他们包括了完整的新的特性,开发人员和架构师必须学习一种新的编程模型。 这一章是一些新的类、结构体和枚举类型,你可以使用这里来处理数据并行的场景。这章将为你展示怎样创建并行代码和描述与每个场景相关的新概念,而不是关注并发编程中的最复杂的问题。这样你将可以更加充分的理解性能改进。开始并行任务 使用先前版本的.NET Framework,开发可以充分利用多核微处理器的并行能力的应用程序是很难的。使用那些可以控制并行的复杂结构来开始..阅读全文
posted @ 2012-06-22 23:21 无风听海 阅读(931) | 评论 (0) 编辑
 
摘要: 并发编程中的NUMA架构为更高的扩展性和NUMA做准备近年来,多处理器支持的最广泛的模型对称多处理器(SMP)让位于非均匀存储器存取(NUMA)架构。对称多处理器模型的一个最大的问题就是处理器总线会限制未来的可伸缩性,因为每一个处理器拥有同样的机会访问内存和输入输出系统。使用非均匀内存访问架构,每个处理器可以更快的访问离自己近的内存。当处理器的数目超过四个的时候,非均匀内存访问架构可以提供更好的伸缩性。在windows的可伸缩性技术条款中,非均匀内存访问架构按照下面所属进行组织(见图1-17)每个计算机或者机器可以有一个或者多个组。每个组有一个或者多个非均匀内存访问节点。每个非均匀内存访问架构阅读全文
posted @ 2012-06-22 06:27 无风听海 阅读(1264) | 评论 (0) 编辑
 
摘要: 并发编程中需要谨记的规则 最小化临界区 Amdahl定律和Gustafson定律都将并行算法中的顺序执行的工作视为性能问题的头号敌人。两个执行代码区段中间的时间需要顺序执行,这就是众所周知的临界值。在图1-16的分析Gustafson定律的图表中有四个这样的临界区。 图 1-16 当你并行化你的任务的时候,为了实现最好的性能我们需要最小化这些临界区。大多的时候,是难以避免并行执行区域之间的串行执行的代码的,因为需要加载并行任务和收集执行结果。然而,优化这些临界区域的代码并且移除不必要的代码比协调并行代码甚至更重要。 当你面对一个拥有太多临街区域的执行计划的时候,要谨记Amdahl定律。如果..阅读全文
posted @ 2012-06-14 00:17 无风听海 阅读(1405) | 评论 (0) 编辑
 
摘要: --理解并发编程中的几种并发方式 时刻谨记并发设计 当你设计代码利用多核优势的时候,重要的是不要老是想着C#程序代码是独自执行的。C#为并发代码做了设计,也就是很多代码可以在同一个进程里同时执行或者交错执行。相同的类方法可以在并行代码里执行。如果这个方法在静态变量里保存了状态,以后再使用这个状态,这样的并行执行会产生非期望的和不可预料的结果。 就像前边解释的,多核微处理器上的并行编程使用的是共享内存模型。如果没有考虑并发,那些在相同的共享内存里的数据可能会导致不可预料的结果。 使每个类和方法可以没有副作用的并行执行是一个好的实践。如果你考虑不能讲...阅读全文
posted @ 2012-06-12 23:33 无风听海 阅读(4030) | 评论 (3) 编辑
 
摘要: 并发编程中的重重量级模型和轻量级模型 使用轻量级并发开发 不管是Amdahl定律还是Gustafson的定律都没有考虑引入并发需要付出的额外开销。同时也没有考虑那些可以将顺序代码转变成可以利用并行优势的算法的设计模式。重要的是减少程序中必须执行的顺序代码,改善对并行执行单元的利用。 以前的.NET 版本,如果你想在一个进程内并行执行C#应用程序,你必须创建和管理多线程(软件线程)。所以,你必须编写复杂的多线程代码。分解算法到多个线程上,协调不同的代码单元,在它们之间共享信息,并且收集执行结果确确实实是一件复杂的编程工作。随着逻辑核心的增多,情况变得甚至更糟了,因为你需要更多的线程来获取更好的可阅读全文
posted @ 2012-06-10 21:37 无风听海 阅读(1552) | 评论 (0) 编辑
 
摘要: 并发编程下的性能定律(翻译) 理解Amdahl定律 如果你想利用多核的优势在尽可能少的时间运行尽可能多的指令,那么就需要以并行的序列分离代码。然而,大多的算法需要运行一些串行代码来调整并行执行。例如,并行执行很多代码块,最后收集他们执行的结果。那些分解并行执行工作复杂和收集执行结果的代码是串行代码,它是不能利用并行的优势的。如果你的算法中有很多这样的代码片段,那么串行代码所占的比例就会增加,并且能够获取到的性能收益就会减少。 Gene Amdahl是一个著名计算机架构师,当一个系统中仅有少量的计算机改善硬件的时候,那么能够获得最大的性能改善是多少呢?他做了大量与这方面有关的观察研究...阅读全文
posted @ 2012-06-04 04:45 无风听海 阅读(1742) | 评论 (9) 编辑
原文地址:https://www.cnblogs.com/Leo_wl/p/5257316.html