博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pthread之工作模式
阅读量:2349 次
发布时间:2019-05-10

本文共 2254 字,大约阅读时间需要 7 分钟。

呵呵,本来只想写写今年学习多线程时碰到的一些问题,没有想到随意列个表,竟然成了一个系列,这一系列包含了互斥、条件变量、信号量等相关的内容、也包括了内存可视性、线程的取消等一些线程使用的高级话题。以这些知识为元素、以

现实现中遇到的问题为对象,为解决这些问题构成下面的几种基本的线程模型(就像编程语言中的for,while,if,switch这些编程的基本结构一样)

线程编程模型

流水线

每个线程反复地在数据系列上执行同一种操作,并把操作结果传递给下一步骤

的其他线程,这就是流水线assembly line)方式

工作组

每个线程在自己的数据上执行操作,工作组中的线程可能执行同样的操作,也可

能执行不同的操作,但是它们一定独立执行

客户端/服务器端

一个客户为每一件工作与一个独立的服务器订契约,通常订契约是匿名

的--一个请求通过某种接口提交

 

流水线:流水线模型在一种意义上讲,是一种串型化的操作,一般来讲下一步的操作需要用到上一步的结果。这种情景从对单

个对象处理的角度来看,性能并没有什么提高,但是如果从大处着眼,并行度大大的增加了。可以看看CPU的流水结构,和这
个差不多一个想法。如果将其比作一个管道的话,它的最大的并行性,就是管道能放下处理对象的容量。
工作组:这 种模型中的线程都各自己狂跑,不会被工作组中的其它线程影响,比如等待线程组中其它线程、或者需要被线程组中的其它线程唤醒、或者和工作组中的其它线程操作同一块内存而需要等待共享锁。工作组中的线程在不同的数据上完成相同的任务,这是单指令多数据[SIMD]的应用;工作组中的线程在不同数据上完成不同的任务(多指令多数据据(MIMD)的应用)
比如我们要对一个巨大的数据矩阵中的数据进行运算,可以同时启动几个线程,其任务就是对给定的地址范围内的数值进
行数学运算。在多CPU的系统中,这种高密集度运算将会大大提高运算速度,然后再通过对各个线程返回的地址进行汇总,即
可得到有效的结果。同样对大量数据的排序、搜索都可以利用上面的这种方法。
再举一个例子,就是下载文件时,对文件做合理分切后,用多个线程对文件进行下载,文件下载完之后,再对文件做相应的
合并即可增加下载的速度。
上面的两个例子都是工作组中的线程作同样的、但又互不干涉的任务,大大增加了并发度,有效利用了现有的资源。(呵呵,补一句,并发度高,并不一定运行速度更加快噢:)多线程也是需要代价的。
再举一个对不同的任务并行处理,这样的例子更加的多,比如两个线程各自操作不同的文件。或者工作队列
客户端/服务器端: 这种模型与网络编程的概念相当,由一方提供另一方一种服务,而另一方能在一定的协议之下得到这种服务。
感受:
     
线程提供了一种异步机制,但面对的最大问题就是同步

 

 

附JAVA多线程模式

我这里可以大概给你介绍一下,但对于每一种编程模型要看具体的示例是什么,而且我不可能给你罗列所有的代码,请谅解。

  
  其实我们编程只要尽量站到比较高的层次,很多道理其实你会发现你已经懂了。
  
  就多线程来说,我们开始设想只有两个线程(>2时是不是算数学归纳法?)那么如果两个独立的线程会发生什么呢?
  
  1。当一个线程进入moniter(也就是说站用一个object),另一个线程只有等待或返回,而我们把返回就称为一种模式,这种模式的英文是Balking。
  
  2。这两个线程可以是有序的执行,而不是让OS来调度,这时我们要用一个object来调度,这种模式称为Scheduler。(这个词及其含义其实OS中就有)。
  
  3。如果这两个线程同时读一个资源,我们可以让他们执行,但如果同时写的话,你闭着眼睛都会知道可能出现问题,这时我们就要用另一种模式(Read/Write Lock)。
  
  4。如果一个线程是为另一个线程服务的话,比如IE中负责数据传输的线程和界面显示的线程,当一个图片没有传完时,另一个线程就无法显示,至少是部分没有传完。那么这时我们要用一个模式称为生产者和消费者,英文是Producer-Consumer。
  
  5。两个线程的消亡也可以不是完全又OS来控制的,这时我们需要给出一个条件,使得每个线程在符合条件是才消亡,也就是有序的消亡,我们称为Two-Phase Termination。
  
  那么有这5个线程模型,基本上可以用到大多数编程任务中。我需要指出的三点是:
  
  1。从高层次上我们可以再验证是否含盖了所有的情况。
  
  2。其实模式不是完全固定的或者说象定律一样,而模式可以为不同的情况进行适当 的调整和组合,目的是为了简洁和高效。
  
  3。学习模式是为了具备更好的分析问题的能力。
  
  而似乎这些来自西方的技术,并且是目前的,我们有没有呢?其实我个人有个大胆的推测,我认为我们祖先的《孙子兵法》就是很好设计模式,因为它符合设计模式需要的基本特征,就是在特定的条件下,用某种特定的方式合理且高效的解决问题。只不过一是用在军事上,二是完备性方面我们还没研究。但我认为我们至少没有很好的扩展和进行类比式的应用,否则今天可能是我们中国人教外国人什么是设计模式。
  
  类比的方法实际上是发明或发现的常用方法。不知能否让你感觉到其实外国的技术并不是那么的神秘,也许我们从自身的文化当中挖掘出的东西太少了。
  
  P.S.更深一步的研究你可以参考Doug Lea. <>.

 

转载地址:http://kexvb.baihongyu.com/

你可能感兴趣的文章
11.组合模式--Composite
查看>>
12.轻量模式--Flyweight
查看>>
13.外观模式--Facade
查看>>
开源史上最成功的八个开源软件
查看>>
More Effective C++读书笔记
查看>>
关于assert,ASSERT,TRACE和VERIFY
查看>>
关于C++中野指针的说明
查看>>
Linux/Unix环境下的make和makefile详解
查看>>
SourceInsight添加对汇编语言文件.s和.S的支持
查看>>
windows 下实现函数打桩:拦截API方式
查看>>
获取Windows系统版本
查看>>
漫谈兼容内核之十二:Windows的APC机制
查看>>
21.windbg-.lastevent、!analyze(dump分析、异常错误码查询)
查看>>
16.windbg-.frame、dt(切换局部上下文、查找结构体)
查看>>
开源任务管理器 Process Hacker (Windows)
查看>>
快速发现Windows中毒的工具:Process Hacker
查看>>
Process Hacker源码中的用户态hook的做法
查看>>
Get IT技能知识库 50个领域一键直达
查看>>
浅析C++中的this指针及汇编实现
查看>>
关于32位程序在64位系统下运行中需要注意的重定向问题(有图有真相)(***)
查看>>