几种多线程编程模型的比较

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多线程模型的关键是,服务器必须要等到客户端的命令后才能工作,而且处理完消息后可能会同客户端进行交互。所以在实现中,服务器端和客户端都要拥有自己独立的消息队列。

多线程编程的关键在于确定多个线程之间的架构,并根据架构构建数据(消息)在线程之间的流通通道。

时间: 2024-12-26 14:44:25

几种多线程编程模型的比较的相关文章

IO复用、多进程和多线程三种并发编程模型

I/O复用模型 I/O复用原理:让应用程序可以同时对多个I/O端口进行监控以判断其上的操作是否可以进行,达到时间复用的目的.在书上看到一个例子来解释I/O的原理,我觉得很形象,如果用监控来自10根不同地方的水管(I/O端口)是否有水流到达(即是否可读),那么需要10个人(即10个线程或10处代码)来做这件事.如果利用某种技术(比如摄像头)把这10根水管的状态情况统一传达到某一点,那么就只需要1个人在那个点进行监控就行了,而类似与select或epoll这样的多路I/O复用机制就好比是摄像头的功能

Java的多线程编程模型5--从AtomicInteger开始

Java的多线程编程模型5--从AtomicInteger开始 2011-06-23 20:50 11393人阅读 评论(9) 收藏 举报 java多线程编程jniinteger测试 AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字.而AtomicInteger则通过一种线程安全的加减操作接口. 来看AtomicInteger提供的接口. //获取当前的值 publ

常见的多线程编程模型

1.基本概念:sleep,join,yied,优先级. 2.进程,线程:独立的内存空间,内存地址,不会相互影响. 3.数据结构:(共享资源的软件模拟)-队列, 4.并发控制:信号量机制(硬件机制原理),软件实现(锁机制-比如读写分离,基于二维的锁兼容性) 5.障碍器,信号量,锁 6.CPU密集型--计算,I/O密集型--传输(网络或者文件)--TCP或者串口等--阻塞和非阻塞(读取-写入-更新--这就是一个原子操作或者微命令) 编程模型: 1.while(true) {new Thread()}

【专家坐堂】四种并发编程模型简介

本文来自网易云社区 概述 并发往往和并行一起被提及,但是我们应该明确的是"并发"不等同于"并行" ?       并发 :同一时间 对待 多件事情 (逻辑层面) ?       并行 :同一时间 做(执行) 多件事情 (物理层面) 并发可以构造出一种问题解决方法,该方法能够被用于并行化,从而让原本只能串行处理的事务并行化,更好地发挥出当前多核CPU,分布式集群的能力. 但是,并发编程和人们正常的思维方式是不一样的,因此才有了各种编程模型的抽象来帮助我们更方便,更不容

多线程编程模型

在学习muduo网络库前,应该先熟悉一下多线程网络服务编程模型.在6.6.2节介绍了11种方案.方案0到方案4用的是阻塞I/O.方案5到方案11用的都是阻塞I/O. 方案0: accept+read/write 方案0不是并发模型,只是一个循环处理.用代码表示的话,可以表示为: while(true) { int fd=accept(--); read(fd,--) or write(fd--); close(fd); } 一次只能处理一个连接,第一个连接处理完毕后,才可以进入下一次循环,否则阻

程序员必知的七种并发编程模型

1.线程与锁线程与锁模型有很多众所周知的不足,但仍是其他模型的技术基础,也是很多并发软件开发的首选. 2.函数式编程 函数式编程日渐重要的原因之一,是其对并发编程和并行编程提供了良好的支持.函数式编程消除了可变状态,所以从根本上是线程安全的,而且易于并行执行. 3.Clojure之道——分离标识与状态 编程语言Clojure是一种指令式编程和函数式编程的混搭方案,在两种编程方式上取得了微妙的平衡来发挥两者的优势. 4.actor actor模型是一种适用性很广的并发编程模型,适用于共享内存模型和

Swing多线程编程(转)

关键字: Swing,多线程,GUI,SwingWorker 摘要: 本文论述了怎样开发多线程的Swing程序,从而提高Swing程序的响应速度和性能. 近期,我将推出一系列研究Swing程序的文章,这也算是为了向Swing这个优秀的GUI库的设计者致敬吧! Swing这种优秀的GUI库一直不能占领桌面市场,实在令人费解,今天,我就用我的努力,为java在桌面市场的成功尽我微薄之力吧! Swing的单线程开发机制 多线程开发,显然要比单线程开发有趣.高效.美妙得多.特别是在Java这种天生支持多

Fork/Join编程模型

1.一种并行计算的多线程编程模型 2.开始--任务分割--多线程异步执行---任务合并--阻塞等待合并结果.(分治算法) 3.work-stealing算法: 每个线程维护一个各自的双端的链表,有新任务时之间插入的前端优先执行,前端无任务时,窃取其他线程双端链表的任务加入到自己的尾端进行处理. 通常的情况下,并发的线程池都是维护一个共享的任务队列,新任务到来时插入到队列的尾部,而线程执行任务时取队列的首部任务,而Fork/Join编 模型刚好相反,优先处理新任务,新任务放在最前面优先执行.自己的

朴素、Select、Poll和Epoll网络编程模型实现和分析——朴素模型

做Linux网络开发,一般绕不开标题中几种网络编程模型.网上已有很多写的不错的分析文章,它们的基本论点是差不多的.但是我觉得他们讲的还不够详细,在一些关键论点上缺乏数据支持.所以我决定好好研究这几个模型.(转载请指明出于breaksoftware的csdn博客) 在研究这些模型前,我决定按如下步骤去做: 实现朴素模型 实现发请求的测试程序 实现Select模型,测试其效率 实现Poll模型,测试其效率 实现Epoll模型,测试其效率 分析各模型性能,分析和对比其源码 针对各模型特点,修改上述程序