多线程以前也写过,用的基本上是浪费委托型,虽然都能勉强工作,都是不太理想,没有很满意的结构,准备花点时间来研究一下,发现网上很少讲模型的,或线程管理的,看来这确实是比较难的,值得好好研究一下。
下面是找到的一点资料:
线程的目的就是代表进程执行工作,如果一个进程拥有多个线程,进程就可以根据一定的策略和方法来管理这些线程,并进行相关工作。先辈们通过总结与抽象,创造了线程模型的概念,这里的线程模型就是我们常说的架构,设计模式等,为我们这些后辈们提供了借鉴的意义。
4.1 线程模型总览
经过前人的摸索,总结与抽象,提炼出了一些通用的模型:
1) 委托模型(delegation),又称为boss-worker模型
2) 对等模型(peer-to-peer)
3) 管道模型
4) 生产者-消费者模型(producer-consumer)
各个模型的含义,如表三所示:
线程模型 | 含义 |
委托模型 | Boss线程创建其他线程(worker线程),并给每个worker线程分配任务。Boss线程可能在每个线程完成它们的任务之前一直等待。 |
对等模型 | 所有的线程都具有相同的工作状态。对等线程创建执行任务所需要的所有线程,但不执行委托职责。对等线程可以从单个输入流处理请求,这些输入流被所有线程共享,或者每个线程都有其自己的输入流。 |
管道模型 | 类似于装配线流程,分阶段处理输入流,然后传给下一个线程进行处理 |
生-消模型 | 生产者线程生产数据给消费者线程使用,数据存储在生产者和消费者共享的存储块中。 |
表 3线程模型及其含义
4.2 委托模型
Boss线程创建其他线程(worker线程),并给每个worker线程分配任务。Boss线程可能在每个线程完成它们的任务之前一直等待。 Boss线程将任务委托给每个worker线程是通过指定一个函数来完成的。由于每个worker线程被分配了任务,所以每个worker线程的职责就是执行指定的任务。
基于以上原理,可以演变出两类委托模型:
浪费型:当系统有请求任务时,boss线程创建worker线程。对每一个请求的处理就能够委托给一个worker线程。在这种情况下,boss线程执行事件循环,当有事件发生时,就创建一个worker线程,并给它们指派职责。如图4所示。
图 4委托模型--浪费型
这类应用实际意义不大,可能常见于试验型或者连接请求不多的情况。因为线程不可能无止境的创建下去,更何况创建太多的线程,势必会影响到系统的性能,这样就造成了性能瓶颈。
节约型:boss 线程创建一个线程池,可以为池中的线程指派任务。当有任务到达时,boss线程发信号通知worker线程进行处理。该worker线程处理完成之后,接 着处理下一个请求。如果没有请求,那么就挂起自身,直到收到boss的通知或者等待一个特定的时间,再次读取请求。如图5所示。
图 5委托模型节约型
其中节约型中的boss线程的主要目的就是创建所有的worker线程,将请求放入队列中,然后唤醒worker线程。Worker线程检查队列中的请求,执行指派的任务。如果没有可供处理的任务,便挂起自己。所有的boss线程和worker线程并发执行。
4.3 对等模型
4.4 管道模型
4.5 生产者-消费者模型
0 comments:
发表评论