pthread之工作模式

呵呵,本来只想写写今年学习多线程时碰到的一些问题,没有想到随意列个表,竟然成了一个系列,这一系列包含了互斥、条件变量、信号量等相关的内容、也包括了内存可视性、线程的取消等一些线程使用的高级话题。以这些知识为元素、以
现实现中遇到的问题为对象,为解决这些问题构成下面的几种基本的线程模型(就像编程语言中的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. <>.

 

你可能感兴趣的:(pthread之工作模式)