全部博文(73)
分类: LINUX
2009-04-23 16:25:53
pthread之工作模式
呵呵,本来只想写写今年学习多线程时碰到的一些问题,没有想到随意列个表,竟然成了一个系列,这一系列包含了互斥、条件变量、信号量等相关的内容、也包括了内存可视性、线程的取消等一些线程使用的高级话题。以这些知识为元素、以
现实现中遇到的问题为对象,为解决这些问题构成下面的几种基本的线程模型(就像编程语言中的for,while,if,switch这些编程的基本结构一样)
线程编程模型
流水线 |
每个线程反复地在数据系列上执行同一种操作,并把操作结果传递给下一步骤 |
工作组 |
每个线程在自己的数据上执行操作,工作组中的线程可能执行同样的操作,也可 |
客户端/服务器端 |
一个客户为每一件工作与一个独立的服务器“订契约”,通常“订契约”是匿名 |
流水线:流水线模型在一种意义上讲,是一种串型化的操作,一般来讲下一步的操作需要用到上一步的结果。这种情景从对单
个对象处理的角度来看,性能并没有什么提高,但是如果从大处着眼,并行度大大的增加了。可以看看CPU的流水结构,和这
个差不多一个想法。如果将其比作一个管道的话,它的最大的并行性,就是管道能放下处理对象的容量。
工作组:这 种模型中的线程都各自己狂跑,不会被工作组中的其它线程影响,比如等待线程组中其它线程、或者需要被线程组中的其它线程唤醒、或者和工作组中的其它线程操
作同一块内存而需要等待共享锁。工作组中的线程在不同的数据上完成相同的任务,这是单指令多数据[SIMD]的应用;工作组中的线程在不同数据上完成不同
的任务(多指令多数据据(MIMD)的应用)。
比如我们要对一个巨大的数据矩阵中的数据进行运算,可以同时启动几个线程,其任务就是对给定的地址范围内的数值进
行数学运算。在多CPU的系统中,这种高密集度运算将会大大提高运算速度,然后再通过对各个线程返回的地址进行汇总,即
可得到有效的结果。同样对大量数据的排序、搜索都可以利用上面的这种方法。
再举一个例子,就是下载文件时,对文件做合理分切后,用多个线程对文件进行下载,文件下载完之后,再对文件做相应的
合并即可增加下载的速度。
上面的两个例子都是工作组中的线程作同样的、但又互不干涉的任务,大大增加了并发度,有效利用了现有的资源。(呵呵,补一句,并发度高,并不一定运行速度更加快噢:)
多线程也是需要代价的。
再举一个对不同的任务并行处理,这样的例子更加的多,比如两个线程各自操作不同的文件。或者工作队列
客户端/服务器端: 这种模型与网络编程的概念相当,由一方提供另一方一种服务,而另一方能在一定的协议之下得到这种服务。
感受:
线程提供了一种异步机制,但面对的最大问题就是同步!