多线程与并行程序设计
文章平均质量分 74
zy__
这个作者很懒,什么都没留下…
展开
-
C++多核高级编程 - 09 并发模型之 五 黑板 Blackboard
黑板是一个集中对象,每个线程都可以访问它。对黑板的访问必须同步。每个线程可以张贴初步的结果或数据。线程也可以对结果或数据进行处理以创建部分的解。黑板模型的图示:原创 2012-08-18 18:18:45 · 1812 阅读 · 0 评论 -
C++多核高级编程 - 01 新的计算机体系结构及多核设计
多核是将多个处理器放在一个计算机芯片上的设计,每个处理器被称作一个核。这些设计被称作芯片多处理器(Chip Multiprocessor CMP)。多核处理器的常见配置:配置 1: 超线程处理器,在一个芯片上运行一个或多个线程,是逻辑上的多处理器,而不是物理上的。配置 2: 现在主流的多核处理器,一个芯片上为一个处理器。配置 3: 未来的发展方向,在一个芯片上存在多个物理原创 2012-04-30 21:24:33 · 1736 阅读 · 0 评论 -
POSIX 学习笔记---工作流
POSIX 工作流 :每个线程反复的在数据系列集上执行同一种操作,并把操作结果传递给下一步骤的其他线程。每个线程由 stage_t 描述:一个互斥量 m_mutex两个条件变量:m_ready_cond:表示当前的线程准备好处理新数据m_available_cond:表示通知下一步数据已经可用整个流水线由 pipe_t 描述,构造了一个流水线的队原创 2012-02-05 20:31:22 · 699 阅读 · 0 评论 -
多核计算与程序设计 - 01 基础知识 之一 多核编程与单核多线程和分布式编程的区别
这个分类的知识来自周伟明先生的《多核计算与程序设计》一书,在此把书中对我个人帮助较大的部分整理出来,以便更容易的在工作中加以应用。一,多核编程与单核多线程的区别1, 锁竞争导致的串行化的区别在单核系统中如果某个线程获取了锁,那么这个线程将获取CPU的运行时间,其他线程将被阻塞。但CPU始终处于运行状态,影响计算时间的其实只是加锁和解锁的时间。并不会发生CPU空闲的现象。原创 2012-09-01 15:12:40 · 5405 阅读 · 0 评论 -
多核计算与程序设计 - 02 基础知识 之二 锁
锁在并行运行中比不可少,用于并行程序间的同步,互斥。一把双刃剑,用好了可以帮助并行程序提高效率,如果使用不当虽是并行程序,其效果可能还不如单一线程的程序。一,基本特点1) 互斥特性锁的互斥特性基本可以分成基本互斥和条件互斥,基本互斥的主要动作是获取锁和释放锁,是最基本的特性。条件互斥则是在基本互斥的基础上加上条件控制,例如计数器信号量是一个比较典型的条件互斥。2原创 2012-09-09 15:46:11 · 1277 阅读 · 0 评论 -
多核计算与程序设计 - 03 基础知识 之三 线程的安全退出
使用多线程编程时,线程经常会访问共享资源,但在程序退出时,要在合适的时间释放这些资源,避免线程对资源的访问还未结束时,资源已经被释放造成异常,或者造成内存溢出,资源没释放等其他问题。单个线程的运行时安全退出和多线程安全退出原理是一样的,通过一个退出事件来通知主线程可以正常释放共享资源,区别是多了一个资源计数器,保证所有的线程都已经不再访问资源了。书中的图示给表示的非常清楚。线程不安原创 2012-09-16 14:00:17 · 1211 阅读 · 0 评论 -
多核计算与程序设计 - 04 基本算法和数据结构 之一 多线程栈
栈:基本的数据结构之一,有先进后出的特性。当栈用于多线程程序的时候,必须要为其加上锁保护才能避免重入的问题。在多线程程序中,在调用栈的地方加锁,完成后再解锁,这可能导致程序复杂,而且在很多地方会涉及到加锁解锁等操作,很难维护。正确的方式是在操作函数内部直接加锁,或再用函数对加锁过程进行封装,其他函数直接使用具有加锁和解锁功能的函数是最理想的。下面的程序封装了一个有锁功能的栈原创 2012-10-27 16:38:43 · 936 阅读 · 0 评论 -
多核计算与程序设计 - 05 基本算法和数据结构 之二 多线程链表
链表是数据结构中的基础知识,这里不做详细说明。这里说的多线程链表主要是对链表的访问加了一些互斥等访问控制,使多线程可以安全的访问链表。多线程链表中有锁,用来保障线程对队列的访问时的互斥性。此程序运行在 Red Hat Linux上, 使用 pthread 库。#include #ifndef __MT_LIST_H__#define __MT_LIST_H__t原创 2012-12-16 13:45:25 · 1748 阅读 · 0 评论 -
多核计算与程序设计 - 06 基本算法和数据结构 之三 哈希表与哈希链表
一,哈希表哈希表:hash(杂乱信息的意思) 的音译,用来把一些杂乱无章的信息根据其关键字的特点映射到一个连续的空间,操作简单,用途广泛,例如:电子词典。这里用到的映射方法称为 索引方法。对应的实现函数称为哈希函数。将映射后的值称为索引。1) 哈希表的索引方法整除取余法对于整数而言,是很常用的一个方法,能够很快的计算出索引值,但有时候会产生较多的相同的索引,使算法退化原创 2013-02-10 22:45:59 · 974 阅读 · 0 评论 -
多核计算与程序设计 - 07 基本算法和数据结构 之四 树
普通树一种数据结构,有一个根,根下面有子树和叶子,子树下面又有子树和叶子。树的结构:树的遍历树的遍历分深度优先和广度优先,深度优先是先处理子节点,然后是叶子,而且还分为先序(先操作节点后继续遍历)和后序(先遍历节点后操作)广度优先是先处理叶子,后遍历节点。深度优先(先序)深度优先(后序)原创 2013-05-26 11:41:19 · 2395 阅读 · 0 评论 -
多核计算与程序设计 - 08 基本算法和数据结构 之四 二叉树
基础知识 二叉树: 一种特殊的普通树,每个节点刚好有两棵子树(包括为空的)的普通树。 树梢节点: 左右子树至少有一个节点为空的子树。 最小树梢节点和最小树梢高度: 离根节点最近的树梢节点为最小树梢节点,最小树梢节点到根节点的距离为最小树梢高度。 最大树梢节点和最大树梢高度: 离根节点最远的树梢节点为最大树梢节点,最大树梢节点到根节点的距离为最大树原创 2013-06-30 15:06:34 · 1108 阅读 · 0 评论 -
C++多核高级编程 - 02 并行程序设计中系统的任务及挑战
一,并行的概念如果两个事件在相同的时间间隔内发生,则我们称他们是并发的。两个或多个任务在相同时间间隔内执行,则我们称他们是并行的。如果两个任务在同一秒并行,但其实两个任务可能在同一秒的不同部分执行。例如第一任务在第一个十分之一秒运行第二个任务则在第二个十分之一秒运行,之后又是第一个任务.... 交替运行。但由于时间较短给人的感觉还是两个任务在同时进行。时间的间隔可以放大,也可以缩小。无论任务间原创 2012-04-30 21:37:47 · 1963 阅读 · 0 评论 -
C++多核高级编程 - 03 操作系统的角色和任务
1, 操作系统的角色操作系统的作用主要有2个:- 软件接口: 为计算机的硬件资源定义提供一致且定义良好的接口。- 资源管理:管理硬件资源以及其他正在执行的应用软件,作业和程序。1-1 提供一致的接口操作系统出现之前程序员必须要熟悉特定的指令集和每个设备的特性。显卡,磁盘驱动,打印机等都有完全不同的指令集,而且不同厂商的指令集也不一样。程序很难有通用性。原创 2012-05-12 17:06:11 · 1739 阅读 · 0 评论 -
C++多核高级编程 - 09 并发模型之 四 生产者/消费者 Producer/Consumer
生产者/消费者 (Producer/Consumer)工作方式图示。 生产者产生数据,消费者处理数据,如果消费者处理速度慢于生产者,可以考虑使用缓存技术。生产者/消费者 一对一工作方式生产者/消费者 多对多工作方式原创 2012-08-18 17:45:07 · 2577 阅读 · 0 评论 -
C++多核高级编程 - 09 并发模型之 三 流水线 Pipe
流水线工作方式的图示流水线中线程,线程队列对每个输入进行处理,一个阶段的线程处理完成后,将会把数据交给下一阶段的线程。最后一阶段的线程产生输出结果。如果前一阶段处理的速度高于下一阶段的线程,可以使用缓冲区作为使其同步工作的手段。原创 2012-08-18 17:11:35 · 5042 阅读 · 0 评论 -
C++多核高级编程 - 09 并发模型之 一 Boss-Worker
Boss-Worker 之前有过一些介绍,下面将用图示的方式介绍一些这个模型,及它的一些演化结构。一,Boss-Worker 使用方法1Boss为每个任务创建新线程或进程这些任务可以并行。注意 ITC 和 IPC的通信方式是不一样的Boss-Worker使用线程Boss-Worker使用进程二,Boss-Worke原创 2012-08-18 16:09:59 · 2278 阅读 · 0 评论 -
C++多核高级编程 - 08 并行程序的测试
测试在软件生命周期中是不可缺少的,它是软件工程的一部分,重要性不用多说。原书中此章讲的是并行程序的测试和逻辑容错,但关于逻辑容错的部分内容少了点,还是觉得测试这部分对实际工作有着较大的作用。一, 测试并行程序中的问题和挑战多线程或多处理器程序会遇到的一些问题:模拟最小到最大的容积负荷在调试期间负责精确的控制流在调试期间负责精确的竞争条件错误复制全系统的进程竞争和线程竞争原创 2012-08-18 09:06:30 · 1000 阅读 · 0 评论 -
C++多核高级编程 - 07 应用程序并行设计方法 (PADL 和 PBS)
一,为大规模多核处理器设计应用程序如果有成百个或上千个并发执行的线程或进程,如何设计或如何管理IPC则是一件非常令人生畏的事情。“应用程序设计” 本身就是一个非常宽泛的术语。对于不同类型和级别的开发人员这个术语有着不同的含义。其实软件和应用程序也有着各种各样的分类。下表是美国计算机协会(Association of Computing Machinery ACM)的 CCS(Computing原创 2012-08-11 09:53:37 · 1977 阅读 · 0 评论 -
C++多核高级编程 - 06 并发任务的通信和同步(3) 线程的策略方法及工作的分解和封装
一 , 线程的策略方法线程的策略决定了在将应用程序线程化时可能使用的方法。方法决定了被线程化的应用程序如何将它的工作委派给任务及通信如何进行。常见的模型:委托(boss-worker)对等(peer-to-peer)流水线(pipeline)生产者-消费者(producer-consumer)在对应用程序建模时对于不同的阶段要采取不同的模型,一个模型可以嵌入到另一个模型原创 2012-07-21 19:45:45 · 1132 阅读 · 0 评论 -
C++多核高级编程 - 06 并发任务的通信和同步(2) 对并发进行同步
一,同步类型任何计算机系统中,系统资源都是有限的。在多进程或多线程程序组成的系统中,必然会存在对资源的竞争关系。按照资源需求的不同,系统中同步类型大致可分为三种:- 数据:它允许并发线程/进程安全的访问一个内存块。- 硬件:当多个进程或线程需要一个或多个硬件支持时,它允许并发进程或线程安全的访问硬件,并且对于实时性和任务的优先级有一定的要求。-原创 2012-07-01 20:53:24 · 1110 阅读 · 0 评论 -
C++多核高级编程 - 06 并发任务的通信和同步(1) 通信和同步
一, 依赖关系当进程或线程相互之间要求通信或协作完成一个共同的目标时,他们之间便存在了依赖关系。通信依赖:当TaskA要求来自TaskB的数据才能执行它的工作时,TaskA和TaskB之间便存在了通信依赖关系。协作依赖:当TaskA要求的资源被TaskB所拥有,而且在TaskA使用该资源前TaskB必须释放它则他们之间存在协作依赖关系。可以通过列举应用程序中原创 2012-06-24 09:53:17 · 1024 阅读 · 0 评论 -
C++多核高级编程 - 05 多线程
一,什么是线程线程是进程中可执行代码流的序列,它被操作系统调用,并在处理器或内核上运行。所有进程都有一个主线程,主线程是进程的控制流或执行路线。线程分为用户线程和系统线程,线程在创建,维护和管理方面给系统带来的负担要轻得多。线程用于执行系统中的并发任务,可以简化系统中固有的并发的程序的结构。用户级线程和内核级线程线程有三种实现模型: 用户级或应用程序级,内核级,用户级和内核级混合线原创 2012-06-17 19:06:12 · 2338 阅读 · 0 评论 -
C++多核高级编程 - 04 多进程
一,进程概念,为什么是多进程而不是多线程进程是由操作系统创建的工作单元。值得注意的是进程和程序未必是等同的。一个程序可能由多个任务组成,而每个任务可以和一个或多个进程相关联。程序是由程序员创建的,而进程是由操作系统创建的。一个工作单元要想被称作进程,它必须要有操作系统指派给他的地址空间,必须拥有进程ID,必须拥有状态和进程表中的表项。进程和线程之间最大的区别是进程有着自己的地址空间,而线程共享原创 2012-06-03 20:31:40 · 5099 阅读 · 0 评论 -
多核计算与程序设计 - 09 基本算法和数据结构 之四 AVL搜索树
AVL搜索树AVL 树概念:一个自平衡的二叉树,左右子树的高度的差不超过1。它的名字得名于它的发明者G.M. Adelson-Velsky 和 E.M. Landis。AVL搜索树操作 之 插入操作插入操作的关键点是找到离插入点最近的,并且因为插入新的节点而成为不平衡节点的点。这里且把它称为A节点。基本情况:找到二叉树不平衡的节点,然后对它进行选择,得到平衡原创 2014-02-02 12:48:02 · 786 阅读 · 0 评论