工作组模型
1.多个worker共享一个数据队列,所以每次dequeue时要先检查队列是否为空。不为空才能的返回消息。
2.enqueue可以不用关心队列消息数,只需要enqueue然后通知线程即可。
3.示例中,条件变量condDone是可选的。某些情况下需要知晓队列是否为空的状态,可以考虑增加这个条件变量并编写接口。
C/S模型
1.只有一个线程处理消息,然后再把处理后的消息通过客户端的消息队列同客户端交互。
流水线模型
1.流水线有很多节点,后面的节点阻塞会导致前面的节点阻塞。前面的节点是否阻塞并不影响后面节点的工作。队列尾部和头部可以同时读写。这跟现实中时一样的。
2.流水线为了实现严格的执行顺序,每个节点的数据结构构成了消息队列的一环,并且一定要有信号量和条件变量来控制执行顺序。
各个编程模型的作用
流水线模型主要用来严格控制线程的执行顺序。工作组模型可以用来提高消息的处理处理速度。C/S模型主要用来提供多线程交互的架构。实际编程中,这几种是一起混着用的。
各个编程模型的区别
流水线模型里,每个线程干的活是不一样的。
工作组模型里,所有的线程都可以从队列尾部取出消息进行处理,所有线程的实现逻辑都是一样的。
客户/服务器模型里,用于处理消息的线程只有一个。为了提高并发度,可以采用工作组的模式来处理消息。C/S多线程模型的关键是,服务器必须要等到客户端的命令后才能工作,而且处理完消息后可能会同客户端进行交互。所以在实现中,服务器端和客户端都要拥有自己独立的消息队列。
多线程编程的关键在于确定多个线程之间的架构,并根据架构构建数据(消息)在线程之间的流通通道。
线程支持有两种,一种是 用户线程 ,一种是 内核线程
用户线程和内核线程之间存在某种关系,有多对一模型,一对一模型,多对多模型。
多对一模型:
多对一模型是多个用户级线程到一个内核线程 。
优点 :线程管理是由用户空间的线程库来完成的,因此效率更高。
缺点:
一个进程执行阻塞系统调用,那么整个进程将会堵塞
任一时间只有一个线程可以访问内核,所以多个线程不能并行运行在多处理核系统上。
一对一模型:
映射每个用户线程到一个内核线程。该模型
优点:
在一个线程执行阻塞系统调用时,能够允许另一个线程继续执行,所以它提供了比多对一模型更好的 并发功能 。
允许多个线程 并行运行 在多处理器系统上。
缺点:
创建内核线程的开销会影响应用程序的性能,所以这种模型的大多数实现限制了系统支持的线程数量。
linux,windows操作系统家族都实现了一对一模型。
多对多模型 :
多对多模型多路复用多个用户级线程到同样数量或更少数量的内核线程。
优点:
开发人员可以任意创建多的用户线程,相应内核线程能在多处理器系统上并发执行。
一个线程执行阻塞系统调用时,线程可以调度到另一个线程来执行
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)