http://blog.csdn.net/muclenerd/article/details/41869073
几种模型的特点
工作组模型
1.多个worker共享一个数据队列,所以每次dequeue时要先检查队列是否为空。不为空才能的返回消息。
2.enqueue可以不用关心队列消息数,只需要enqueue然后通知线程即可。
3.示例中,条件变量condDone是可选的。某些情况下需要知晓队列是否为空的状态,可以考虑增加这个条件变量并编写接口。
C/S模型
1.只有一个线程处理消息,然后再把处理后的消息通过客户端的消息队列同客户端交互。
流水线模型
1.流水线有很多节点,后面的节点阻塞会导致前面的节点阻塞。前面的节点是否阻塞并不影响后面节点的工作。队列尾部和头部可以同时读写。这跟现实中时一样的。
2.流水线为了实现严格的执行顺序,每个节点的数据结构构成了消息队列的一环,并且一定要有信号量和条件变量来控制执行顺序。
各个编程模型的作用
流水线模型主要用来严格控制线程的执行顺序。工作组模型可以用来提高消息的处理处理速度。C/S模型主要用来提供多线程交互的架构。实际编程中,这几种是一起混着用的。
各个编程模型的区别
流水线模型里,每个线程干的活是不一样的。
工作组模型里,所有的线程都可以从队列尾部取出消息进行处理,所有线程的实现逻辑都是一样的。
客户/服务器模型里,用于处理消息的线程只有一个。为了提高并发度,可以采用工作组的模式来处理消息。C/S多线程模型的关键是,服务器必须要等到客户端的命令后才能工作,而且处理完消息后可能会同客户端进行交互。所以在实现中,服务器端和客户端都要拥有自己独立的消息队列。
多线程编程的关键在于确定多个线程之间的架构,并根据架构构建数据(消息)在线程之间的流通通道。